0Pricing
C++ Academy · レッスン

vectorの変更:insert、erase、clear

イテレーターの無効化規則に注意しながら、要素の挿入、削除、消去を行います。

「vectorの変更:insert、erase、clear」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

末尾への挿入

最も高速な挿入方法は push_back または emplace_back です。どちらも末尾への追加を償却 O(1) で行います。

任意の位置への挿入

insert(pos, value) は、pos より後ろにあるすべての要素を右へ移動します。計算量は O(n) です。

std::vector<int> v = {1, 2, 4, 5};
v.insert(v.begin() + 2, 3);   // {1, 2, 3, 4, 5}

範囲の挿入

別のコンテナにあるすべての要素を一度に挿入できます。

std::vector<int> v = {1, 5};
std::vector<int> mid = {2, 3, 4};
v.insert(v.begin() + 1, mid.begin(), mid.end());
// {1, 2, 3, 4, 5}

同じ値の複数コピーを挿入

同じ値を n 個挿入します。

std::vector<int> v = {1, 4};
v.insert(v.begin() + 1, 2, 99);   // {1, 99, 99, 4}

1つの要素の削除

erase(pos) はイテレーターが指す要素を削除し、それより後ろにあるすべての要素を左へ移動します。次の要素を指すイテレーターを返します。

std::vector<int> v = {1, 2, 3, 4};
v.erase(v.begin() + 1);   // {1, 3, 4}

範囲の削除

半開区間 [first, last) に含まれるすべての要素を削除します。

v.erase(v.begin() + 1, v.begin() + 3);

erase-remove イディオム

空き要素を残さず、条件を満たすすべての要素を削除するには、std::remove_if と erase を組み合わせます。

#include <algorithm>
v.erase(
    std::remove_if(v.begin(), v.end(), [](int x) { return x < 0; }),
    v.end()
);

C++20 の std::erase と std::erase_if

C++20 では、erase-remove イディオムをラップする非メンバー関数が追加されました。

std::erase(v, 0);                    // remove all 0s
std::erase_if(v, [](int x) { return x < 0; });

clear: すべての要素を削除

clear() はすべての要素を削除しますが、capacity は保持します。vector に再び要素を追加する予定がある場合に便利です。

pop_back: 最後の要素を削除

末尾の要素を O(1) で削除します。戻り値はないため、要素が必要な場合は先に取得してください。

int last = v.back();
v.pop_back();

イテレーターの無効化規則

insert と erase は、変更された位置以降のすべてのイテレーターを無効にします。erase は次に有効なイテレーターを返すため、そのまま反復を続けられます。

理解度チェック

std::remove_if だけを使うと、vector に対して何が起こりますか。

まとめ

insert と erase は任意の位置で O(n) の操作を行います。末尾で O(1) の操作を行うには push_back/pop_back を使用してください。条件に一致する要素を削除するには、erase-remove イディオム(または C++20 の std::erase_if)を適用してください。

よくある質問

「vectorの変更:insert、erase、clear」レッスンは無料ですか?

はい。「vectorの変更:insert、erase、clear」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「vectorの変更:insert、erase、clear」で何を学びますか?

イテレーターの無効化規則に注意しながら、要素の挿入、削除、消去を行います。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「vectorの変更:insert、erase、clear」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. std::vectorの基本:push_back、size、capacity
  2. vectorの反復処理:インデックス、範囲for、イテレーター
  3. vectorの変更:insert、erase、clear
  4. vector、std::array、C配列の比較
← C++ Academyに戻る