背景
我想操作 vector 的拷贝,但是对其每个元素执行 vector 复制操作通常是昂贵的操作。
我在某处读到的称为浅拷贝的概念是默认的拷贝构造函数行为。但是我不确定为什么它不起作用,或者至少我尝试复制 vector 对象,结果看起来像一个深拷贝。
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 来构建一个包含原始 vector 中每个元素的指针的新 vector ?
最佳答案
您可以将元素 vector 转换为指向原始 vector 元素的指针 vector 的一种方法,与您的示例相比,这种方法在效率方面更好,因为它预先分配了 vector 的缓冲区指针,恕我直言,更优雅的是通过使用 std::transform
如下:
std::vector<Vertex*> myvertices(vertices.size());
std::transform(vertices.begin(), vertices.end(), myvertices.begin(), [](Vertex &v) { return &v; });
或者如果您不想对一元运算符使用 lambda:
std::vector<Vertex*> myvertices(vertices.size());
std::transform(vertices.begin(), vertices.end(), myvertices.begin(), std::addressof<Vertex>);
注意:如果您更改了原始 vector ,则会使指针 vector 中的指针无效。
关于c++ - 如何从另一个 vector/对象集构造一个新的 vector/指针集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39088533/