私は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));
}
は明らかにそれが構築し、各A
をコピーしている私に出力
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
を組み立てるだけです。これは可能ですか?なぜ誰かが理由を説明できないのですか?ありがとうございました。
EDIT:ちょうど完了のためpush_back
ため が同じ
問題は 'のstd :: initializer_list'は、それが要素をコピーする必要があります使用してそのすべてのコンストラクタ内容だ「所有する」ということです。それは理にかなっていませんが、 'std :: initializer_list'がどのように動作するかです。不運。 – ipc
@ipc他の建設事例はどうですか?それは他の人にとって可能ですか? –
@Aurora:実際、あなたが考えるよりもはるかに簡単です。 'A(6)'を追加する代わりに '6'を追加するだけです。 –