矢量参考问题

时间:2014-12-29 17:31:44

标签: c++ vector

我创建另一个矢量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;
        }
    }
}

1 个答案:

答案 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_ptrweak_ptrunique_ptr非常有帮助。虽然它们有助于自动释放内存,但更重要的是,它们意味着应该如何使用变量的合同。