std::vector<int> a;
std::vector<int> b;
std::vector<int> c;
b
の要素とc
の要素を に追加して、これら 3 つのベクトルを連結したいと思いますa
。これを行う最適な方法はどれですか。また、その理由は何ですか。
1)使用方法vector::insert
:
a.reserve(a.size() + b.size() + c.size());
a.insert(a.end(), b.begin(), b.end());
a.insert(a.end(), c.begin(), c.end());
b.clear();
c.clear();
2)使用方法std::copy
:
a.reserve(a.size() + b.size() + c.size());
std::copy(b.begin(), b.end(), std::inserter(a, a.end()));
std::copy(c.begin(), c.end(), std::inserter(a, a.end()));
b.clear();
c.clear();
3)std::move
(から)を使用することによりC++11
:
a.reserve(a.size() + b.size() + c.size());
std::move(b.begin(), b.end(), std::inserter(a, a.end()));
std::move(c.begin(), c.end(), std::inserter(a, a.end()));
b.clear();
c.clear();
ベストアンサー1
私の意見では、最初の解決策が最善の方法です。
vector<>::insert
要素を追加するように設計されているため、最も適切なソリューションです。
いくらかのスペースを予約するために宛先ベクトルを呼び出すこともできますreserve
が、大量のベクトルを追加しない限り、それほど多くの利点は得られないでしょう。追加される要素の数がわかっていれば、1 回の呼び出しvector<>::insert
だけを回避できます。reserve
注記: これらがvector
より複雑な型 (カスタム クラスやstd::string
) の場合、 を使用するとstd::move
コピー コンストラクターが回避されるため、パフォーマンスが大幅に向上します。int
ただし、 のベクターの場合は、何の利点もありません。
注2std::move
: を使用すると、ソースvector
のコンテンツが使用できなくなることに注意してください。