2013-02-08 102 views
0

我有一个类,它有一个私人int _i成员。我想要将n个实例存储在一个向量中。因此,我给了矢量的初始容量。另外,我想持有具有不同_i值的对象,并在循环中构造具有不同值的对象。对应的代码如下:C++自定义类型矢量优化

#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 

Accutually,我不知道deafult和临时对象创建是否暴露出性能问题或没有。

+0

该代码不会生成该输出。 – 2013-02-08 21:30:51

+0

Accutually,我认为它因编译器而异。 @BenVoigt – 2013-02-08 21:32:00

+1

不,我的意思是*代码不会在任何编译器上打印出'-1'。 – 2013-02-08 21:32:37

回答

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); 
} 
+0

cc 0 ccc 0 dc 0 cc 1 ccc 1 dc 1 – 2013-02-08 22:52:38

+0

以上是现在的输出。这可以做到没有复制构造函数调用? – 2013-02-08 22:53:49

+0

@Ian:[我没有看到复制构造函数调用](http://ideone.com/rUuOJN)。你确定你按照我的建议使用过'emplace_back(i)',而不是'push_back(A(i))'或'emplace_back(A(i))'吗? – 2013-02-08 23:02:11