2014-12-29 3 views
-3

Причина, по которой я создаю другую векторную температуру, заключается в том, что я хочу сохранить исходные значения. Однако после выполнения функции значения все еще изменяются. Когда я отлаживаю, я понимаю, что они указывают на то же адресное местоположение. Почему это так? и как я могу это исправить?Справочная проблема

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

Поскольку вы удерживаете указатели на элементы ... go for 'vector ' – quantdev

+0

Если вы скопируете 'vector ', элементы будут скопированы как они есть. В вашем случае 'T' является указателем, поэтому значения указателя (адреса, на которые они указывают) будут одинаковыми как в исходном векторе, так и в копии. –

+0

Есть ли какая-то конкретная причина, по которой вы используете 'vector ' вместо 'vector '? –

ответ

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 действительно полезны. Хотя они помогают с автоматическим высвобождением памяти, что более важно, они подразумевают договор о том, как использовать переменную.

Смежные вопросы