5

私は C++ を学んでいて、STL コンテナーを見てきました。たくさんの質問がありますが、これが最初に行くことができると思います。このクラスとそのベクトルを考えてみましょう。

class A {
   int i;
   // A(const A&);
public:

   A(int i) : i(i) {cout << "consting " << i << endl;}
   A(const A& ot) : i(ot.i) {cout << "copying " << i << endl;}

};

int main () {
   vector<A> v1 = {A(1),A(2),A(3),A(4)};
   vector<A> v2(1,A(5));
   vector<A> v3;
   v3.push_back(A(6));
}

私に出力を与える

consting 1
consting 2
consting 3
consting 4
copying 1
copying 2
copying 3
copying 4
consting 5
copying 5
consting 6
copying 6

明らかに、それぞれを構築してコピーしていAます。

これを防ぐ方法はありますか。つまり、余分なコピーを避けAてベクターに構築する方法です。これは可能ですか?そうでない場合、誰かが理由を説明できますか? ありがとうございました。

編集:完成のためpush_backに同じことをします

4

2 に答える 2

4

残念ながら、リストの初期化には でのコピーが必要std::vectorです。コンテナーが固定サイズであることがわかっている場合、std::array代わりに を使用することもできます。

std::array<A, 4> a1 = {{A(1),A(2),A(3),A(4)}};

stdout:
consting 1
consting 2
consting 3
consting 4
于 2013-04-10T21:00:28.083 に答える
3

このようにイニシャライザ リスト コンストラクタを使用する場合、コピーを避けることはできません。別の方法は、最初に適切な容量を予約し、次にemplace_back各オブジェクトを予約することです。

vector<A> v1;
v1.reserve(4);
v1.emplace_back(1);
v1.emplace_back(2);
v1.emplace_back(3);
v1.emplace_back(4);

ご覧のとおり、これにより次の出力のみが得られます。

consting 1
consting 2
consting 3
consting 4
于 2013-04-10T20:48:36.980 に答える