我创建另一个矢量temp的原因是因为我想保留原始值。但是,执行该函数后,仍会修改这些值。当我调试我意识到他们指向相同的地址位置。为什么会这样?我该如何纠正这个?
vector<Node*> vertices;
vector<Node*> facility;
...
for (int i = 0; i < facility.size(); i++){
vector<Node*>temp(vertices);
calculateAttDist(0, facility[i]->data, temp);
for (int j = 0; j < vertices.size(); j++){
if (vertices[j]->type == 1 && i != 0 && vertices[j]->aDist > temp[j]->key){
vertices[j]->aDist = temp[j]->key;
}
else if (vertices[j]->type == 1 && i == 0){
vertices[j]->aDist = temp[j]->key;
}
}
}
答案 0 :(得分:1)
除非您可以将设计更改为使用vector<Node>
而不是vector<Node *>
,否则您需要手动执行此操作:
vector<Node*> temp;
temp.reserve(vertices.size());
for (Node* node : vertices)
temp.push_back(new Node(*node));
请注意,您还需要确保释放这些副本!您可能会发现更好的做法是执行以下操作,这会在temp
超出范围时销毁副本。
std::vector<std::unique_ptr<Node>> temp;
temp.reserve(vertices.size());
for (Node* node : vertices)
temp.push_back(std::make_unique<Node>(*node));
并且,如果Node
是某个虚拟基类,而不是像我上面所示那样使用复制构造函数,那么您可能希望创建一些返回正确对象的clone()
方法。
最后,使用课程shared_ptr
,weak_ptr
和unique_ptr
非常有帮助。虽然它们有助于自动释放内存,但更重要的是,它们意味着应该如何使用变量的合同。