【发布时间】:2016-08-22 20:51:28
【问题描述】:
背景
我想操作向量的副本,但是对其每个元素执行向量复制操作通常是昂贵的操作。
我在某处读到的称为浅拷贝的概念是默认的拷贝构造函数行为。但是我不确定为什么它不起作用,或者至少我尝试复制向量对象,结果看起来像一个深拷贝。
struct Vertex{
int label;
Vertex(int label):label(label){ }
};
int main(){
vector<Vertex> vertices { Vertex(0), Vertex(1) };
// I Couldn't force this to be vector<Vertex*>
vector<Vertex> myvertices(vertices);
myvertices[1].label = 123;
std::cout << vertices[1].label << endl;
// OUTPUT: 1 (meaning object is deeply copied)
return 0;
}
天真的解决方案:用于指针复制。
int main(){
vector<Vertex> vertices { Vertex(0), Vertex(1) };
vector<Vertex*> myvertices;
for (auto it = vertices.begin(); it != vertices.end(); ++it){
myvertices.push_back(&*it);
}
myvertices[1].label = 123;
std::cout << vertices[1].label << endl;
// OUTPUT: 123 (meaning object is not copied, just the pointer)
return 0;
}
改进
还有其他更好的方法或std::vector API 来构造一个新向量,其中只包含原始向量中每个元素的指针?
【问题讨论】:
-
如果您使用
myvertices,您将不会操作原始矢量的副本,您将更改原始矢量,您确定这是您想要的吗? -
你为什么不直接通过
vertices来操作元素呢?我不明白你的问题。 -
因为我正在执行一种算法,需要我一个一个地删除顶点,并且应该为另一个测试用例再次重置它。
-
如果您不想更改原始的
std::vector,那么您只需要像您的第一个代码 sn-p 所示那样进行深层复制。 -
我不想拥有深拷贝。我想确保操作非常高效,就像将所有元素的指针复制到另一个向量中一样。
标签: c++ c++11 pointers vector set