我正在学习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
执行相同的操作
答案 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