我有一个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


准确地说,我不知道默认和临时对象的创建是否会暴露性能问题。

最佳答案

使用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 );
}

关于c++ - C++自定义类型 vector 优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14781650/

10-11 16:34