为什么矢量初始化构造和复制?

时间:2013-04-10 20:44:43

标签: c++ c++11

我正在学习C ++,我一直在研究STL容器。我有很多问题,但我认为这可以先行。考虑这个类和它的向量。

class A {
   int i;
   // A(const A&);
public:

   A(int i) : i(i) {cout << "consting " << i << endl;}
   A(const A& ot) : i(ot.i) {cout << "copying " << i << endl;}

};

int main () {
   vector<A> v1 = {A(1),A(2),A(3),A(4)};
   vector<A> v2(1,A(5));
   vector<A> v3;
   v3.push_back(A(6));
}

给我输出

consting 1
consting 2
consting 3
consting 4
copying 1
copying 2
copying 3
copying 4
consting 5
copying 5
consting 6
copying 6

显然,正在构建和复制每个A

有没有办法防止这种情况发生。我的意思是如何避免额外的副本并将A构造到向量中。这是不可能的。如果没有,有人能解释原因吗?谢谢。

编辑: 为了完成起见,push_back执行相同的操作

2 个答案:

答案 0 :(得分:4)

不幸的是,列表初始化需要std::vector的副本。如果您知道容器的大小是固定的,则可以选择使用std::array代替:

std::array<A, 4> a1 = {{A(1),A(2),A(3),A(4)}};

stdout:
consting 1
consting 2
consting 3
consting 4

答案 1 :(得分:3)

使用像这样的初始化列表构造函数时,无法避免使用副本。另一种方法是在开头保留适当的容量,然后emplace_back每个对象:

vector<A> v1;
v1.reserve(4);
v1.emplace_back(1);
v1.emplace_back(2);
v1.emplace_back(3);
v1.emplace_back(4);

As you can see,这只会导致以下输出:

consting 1
consting 2
consting 3
consting 4