0

A クラスがあり、プライベート int _i メンバーがあります。n 個の A インスタンスをベクトルに格納したい。したがって、私はベクトルに初期容量を与えました。また、_i の値が異なるオブジェクトを保持し、値の異なるオブジェクトをループで構築したいと考えています。対応するコードは次のとおりです。

 #include <vector>
#include <iostream>

using namespace std;

class A
{
public:
    A( int i = -1 ) { _i = i; cout << "cc  " << _i << endl; }
    A( const A &other ) { _i = other._i; cout << "ccc " << _i << endl; }
    ~A() { cout << "dc  " << _i << endl; }
    int get_i() const { return _i; }
private:
    int _i;
};

const int n = 2;

vector<A> v( n );

int main()
{
    cout << "---" << endl;

    for ( int i = 0; i < n; i++ )
        v[i] = A( i );

    cout << "---" << endl;

    for ( int i = 0; i < n; i++ )
        cout << v[i].get_i() << endl;

    cin.ignore( 1 );

    return 0;
}

output:

cc  -1
ccc -1
dc  -1
cc  -1
ccc -1
dc  -1
---
cc  0
dc  0
cc  1
dc  1
---
0
1

初期容量パラメータは、最初は不必要にオブジェクトを作成および破棄すると思います。また、最初のループでは、一時オブジェクトも不必要に作成されます。私の質問は、デフォルトおよび一時的なオブジェクトの構築なしでオブジェクトをベクトルに直接渡すようにコードを修正するにはどうすればよいですか? 以下は私の望む出力です:

---
cc  0
cc  1
---
0
1

正確には、デフォルトおよび一時オブジェクトの作成によってパフォーマンスの問題が発生するかどうかはわかりません。

4

1 に答える 1

3

容量の設定reserveには ではなくを使用してください。resizeそして、emplace_back一時的なものを避けるために現場施工に使用します。

vector<A> v;

int main()
{
    v.reserve(n)
    cout << "---" << endl;

    for ( int i = 0; i < n; i++ )
        v.emplace_back( 1 );
}
于 2013-02-08T21:29:30.657 に答える