2

C++ STL でベクトルについて学習しようとしています...

私は次のようなクラスを持っていtempます:

class temp
{
private :
    int a;
public :
    //temp() {}
    temp(int a)
    {
        std::cout<<"ctor called"<<std::endl;
        this->a=a;
    }
    void setA(int a)
    {
        this->a=a;
    }
    int getA()
    {
        return a;
    }
};

さて、主に、私は書きました:

int main() {
    vector<temp> v;
    v.resize(7,temp(5));
    for(int i=0;i<7;i++) {
        v[i].setA(i);
    }

    for(int i=0;i<7;i++) {
        cout<<v[i].getA()<<"\t";
    }
}

私が得た出力は

ctor called
0 1 2 3 4 5 6 

クラス temp の 7 つの異なるオブジェクトを作成しているときに、コンストラクターが 1 回だけ呼び出されたのはなぜですか?

4

2 に答える 2

7

ベクトルの要素は、パラメーターをコピーすることによって初期化されるためです。渡したパラメーターの作成は、コード内で記述した ctor が呼び出される唯一の時間です。呼び出し元の ctorはherestd::vectorで説明されています。呼び出しているのはバージョン (2) です。

copy-ctor をクラスに追加して、何が起こっているかを確認します。

temp(const temp& t)
{
    std::cout<<"copy-ctor called"<<std::endl;
    this->a = t->a;
}

あなたのコードでは、コンパイラはあなたのために copy-ctor を生成しましたが、明らかにデバッグ出力がないため、それを見ることができませんでした。

于 2013-04-06T18:03:05.383 に答える
5

で作成した一時オブジェクトに対してコンストラクターが呼び出されていますtemp(5)。ベクトルのすべての要素は、そのオブジェクトをコピーすることによって構築されます。これはもちろん、代わりにコピー/移動コンストラクターを使用します。

基本的に、vector呼び出しているコンストラクターは、要素の型がCopyInsertableそのベクターにあることだけを必要とします。これは、次の条件が満たされている必要があることを意味します。

allocator_traits<A>::construct(a, p, v);

ここAで、 はアロケーターの型、aはアロケーター オブジェクト、pは既に割り当てられているメモリへのポインター、 はv構築元のオブジェクトです。vこれは基本的に、placement-new を使用してベクターの要素を構築し、値をそのコンストラクターに渡します。この場合、v渡すコンストラクターの 2 番目の引数であるため、コピー/移動コンストラクターを呼び出します。

于 2013-04-06T18:02:24.980 に答える