【C++】std::vector同士の連結を行う方法【注意点と高速化】

vectorクラス同士の連結方法を紹介します(例: {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}

大量データを追加する場合には高速化のために、reserveで事前にキャパシティを設定しておくのも良いでしょう。メモリの再確保を一回で済ませることが出来ます(処理系によっては事前確保が不要になるかもしれません)。

std::vector<int> a = {1};
std::vector<int> b = {2, 3};
a.reserve(a.size() + b.size()); // 追加分のメモリ領域を予め予約
a.insert(a.end(), b.begin(), b.end());
a; // {1, 2, 3}

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関数による手動追加と同等の処理効率が得られます。

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]);

C++高速化のためのテクニックとして覚えておくと良いでしょう。

広告