5

我正在学习 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做同样的事情

4

2 回答 2

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
于 2013-04-10T21:00:28.083 回答
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);

如您所见,这只会产生以下输出:

consting 1
consting 2
consting 3
consting 4
于 2013-04-10T20:48:36.980 回答