假设我有以下代码:
#include <iostream>
#include <vector>
using namespace std;
class X {
public:
int x[1000];
X(int y) { for (int i = 0; i < 1000; i++) x[i] = y; }
};
int main() {
vector<X> v;
X x0(0);
X x1(1);
X x2(2);
v.push_back(x0);
v.push_back(x1);
v.push_back(x2);
cout << v[2].x[33] << endl;
return 0;
}
如果我理解正确,在我的代码中,我在堆栈上为x0
,x1
和x2
分配内存,然后将这些内容复制到{vector
为我分配的内存中。 1}}。此外,据我所知,移动语义在这里无济于事,因为它不完全像X
持有指向位于其他地方的资源的指针。
我可以直接调用vector
为我分配的原始内存块上的构造函数吗?如果没有,处理这类情况的正确方法是什么?
答案 0 :(得分:11)
您需要使用C ++ 11的emplace_back
。
http://en.cppreference.com/w/cpp/container/vector/emplace_back
此外,如果您担心多余的副本/移动,请尝试从v.reserve(3)
开始。
答案 1 :(得分:1)
如果可用,您还可以使用std::ref
或boost::ref
,并在对象中存储对象的引用,从而避免复制。
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
class X {
public:
int x[1000];
X(int y) { for (int i = 0; i < 1000; i++) x[i] = y; }
};
int main() {
std::vector<std::reference_wrapper<X> > v;
X x0(0);
X x1(1);
X x2(2);
v.push_back(std::ref(x0));
v.push_back(std::ref(x1));
v.push_back(std::ref(x2));
cout << v[2].get().x[33] << endl;
return 0;
}