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, notresize来设置容量。然后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 回答