C++ std::vector同士の連結を行う方法【リスト結合 concat】

vectorクラス同士の連結方法を紹介します。concat関数による配列の結合処理に相当する処理を実現します(例: {a, b} + {c, d} → {a, b, c, d})。

目次

要素同士の結合(例: join({a, b}, ",") → "a, b")を行いたい場合には次のページを参考にして下さい。 >> std::vectorの要素を結合する方法【join 区切り文字】

コンテナの連結

insertメンバ関数を用いることで、コンテナからコンテナへの要素追加が可能となります。

std::vector<int> a = {1};
std::vector<int> b = {2, 3};

a.insert(a.end(), b.begin(), b.end()); // 連結
a; // {1, 2, 3}

a.insert(a.end(), {4, 5});
a; // {1, 2, 3, 4, 5}

a.insert(a.begin(), {8, 9});
a; // {8, 9, 1, 2, 3, 4, 5}

insertの第一引数には追加先の要素位置をイテレータの形で指定します。指定された要素位置の先頭に第二引数以降に指定された新たな要素が追加されます。第二引数と第三引数には追加元の要素範囲を指定します。第二引数に{要素...}という形で初期化リストを渡すことも可能です(あくまでinitializer_listを受け取るものであり、コンテナを直接渡すことはできません。不可: a.insert(a.end(), b);

back_inserter利用時の注意

copy関数とback_inserter関数を組み合わせる方法も知られていますが、この方法で大量データを追加する場合には事前にキャパシティを広げておく必要があるため、注意してください。必要なキャパシティを事前に確保しておかないと、コピー中に要素の再配置が頻繁に行われるようになり、処理効率が悪くなります。

std::vector<int> a = {1};
std::vector<int> b = {2, 3/*, ...大量データ*/};
a.reserve(a.size() + b.size()); // 必須
std::copy(b.begin(), b.end(), std::back_inserter(a));
a; // {1, 2, 3, ...}

ただし、キャパシティを超えない程度のデータ追加であれば、push_back関数による手動追加と同等の処理効率が得られます。もっとも先程のinsertを用いた方法のほうがより効率的な処理となることがほとんどです。

std::vector<int> a = {1};
a.reserve(3);
std::vector<int> b = {2, 3};

std::copy(b.begin(), b.end(), std::back_inserter(a));
// 同等処理
// a.push_back(b[0]);
// a.push_back(b[1]);
広告