2013-12-19 1 views
0

Если вы посмотрите на вывод, вы увидите, что такое содержимое listOrder, и это правильное содержимое. Однако, как только я передаю его в свой конструктор графа и выдаю тот же список, у меня есть jibberish. Я подозреваю, что это имеет какое-то отношение к моему граничному смежному списку содержимого Vertex *, но я не понимаю, как меняются мои указатели. Пожалуйста, помогите мне получить правильные узлы в векторе графика!Почему мой вектор меняется после прохождения через конструктор?

for (vector<char>::iterator it=listOrder.begin(); it!=listOrder.end(); ++it) 
{ 
    cout << "ListNode: " << *it << endl; 
} 
Graph graph(listOrder, adjacencyList); 
for (vector<char>::iterator it=graph.getOrder().begin(); it!=graph.getOrder().end(); ++it) 
{ 
    cout << "Node: " << *it << endl; 
} 

Конструктор

Graph::Graph(vector<char> newVertices, map<char, Vertex*> newAL) 
{ 
vertices = newVertices; 
adjacencyList = newAL; 
} 

функция GetOrder

vector<char> Graph::getOrder() 
{ 
return vertices; 
} 

Выход

ListNode: A 
ListNode: B 
ListNode: C 
ListNode: D 
ListNode: E 
ListNode: F 
ListNode: G 
Node: ░ 
Node: ↨ 
Node: > 
Node: 
Node: ─ 
Node: 
Node: > 
+1

Я не вижу, вы выводя тот же список, я вижу два разных списка. Объясните себе, пожалуйста, и добавьте еще немного кода для функции 'getOrder'. –

+0

Уже добавили код – CodeManiak

+0

Вы пробовали valgrind? – razeh

ответ

3

Вы возвращаете копию вектора каждый раз, когда getOrder называется, поэтому итераторы не из того же контейнера.

Либо верните вектор от getOrder по ссылке, либо позвоните только getOrder, чтобы получить копию вектора, а затем перейдите через это.

Что-то вроде:

vector<char> v(graph.getOrder()); 
for (vector<char>::iterator it=v.begin(); it!=v.end(); ++it) 
{ 
    cout << "Node: " << *it << endl; 
} 
+0

Определенно, это была проблема – CodeManiak

+0

Хорошая уловка! Я пропустил это полностью. –

0

Я предложил бы использовать диапазон на основе для. Это поможет вам избежать некоторых проблем, с которыми вы сталкиваетесь.

Функция getOrder возвращает каждый вектор на другой вектор, что означает, что вы не можете корректно сравнивать итераторы от одного вызова к другому.

Если вы переделывают свой код, чтобы это что-то вроде этого:

for (auto &it : listOrder) 
{ 
    cout << "ListNode: " << it << endl; 
} 
Graph graph(listOrder, adjacencyList); 
for (auto &it : graph.getOrder()) 
{ 
    cout << "Node: " << it << endl; 
} 

Это будет иметь больше шансов на работу.

+0

Это не будет компилироваться без указания типа итератора. Кроме того, диапазоны, основанные на циклах, не разрешены в C++ 98, и это то, что мне нужно для работы с – CodeManiak

+0

, но вам все равно нужно избегать сравнения итераторов от разных вызовов с getOrder(). – razeh

+0

Если я сравниваю значение, а не адрес, почему это проблема? – CodeManiak

0

использовать конструктор копирования для инициализации вашего класса

ЧЛЕНОВ
Graph::Graph(vector<char> newVertices, map<char, Vertex*> newAL) 
: vertices(newVertices) 
, adjacencyList(newAL) 
{} 
+0

Пробовал, но это не исправить проблему :( – CodeManiak

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