2013-05-18 4 views
2

У меня есть объект G который является графиком. Я перегрузил операторы скобок, так что G[i] возвращает list<int> (список STL), который является списком вершин i.Почему эти два сегмента кода дают мне разные результаты?

У меня есть два сегмента кода, которые оба должны перебирать G[i], но работает только первый.

list<int> adj = G[2]; 

for(list<int>::iterator it = adj.begin(); it != adj.end(); it++) { 
    cout << *it << " "; 
} 

Это не работает ...

for(list<int>::iterator it = G[2].begin(); it != G[2].end(); it++) { 
    cout << *it << " "; 
} 

Насколько я могу видеть, что они делают то же самое. Может ли кто-нибудь объяснить, почему второй сегмент кода не работает? Кроме того, есть ли лучший способ повторить мой список?

+0

Что вы подразумеваете под "не работает"? – Johnsyweb

+0

Он не производит никакого вывода. – Duncan

ответ

5

я перегрузил операторы кронштейна так, что G[i] возвращает list<int>

Убедитесь, что возвращаемый тип вашего operator [] является list<int>&, не list<int>. В противном случае копия будет создана по возвращении при каждом вызове G[2], поэтому G[2].end() никогда не будет достигнута.

Если вы вызываете [] один раз, то, как вы в первом фрагменте кода отличая adj, проблема не будет видна (хотя список будет скопирован в два раза - один раз в return, и еще раз в операторе присваивания). Второй фрагмент вызывает проблему, вызывая оператор [] несколько раз.

+0

Вот почему! благодаря – Duncan

3

Возможно, Graph::opertor[] возвращает новый list каждый раз, поэтому вы не можете сравнивать итератор между разными списками.

list<int> adj = G[2]; 
list<int>::iterator end = adj.end(); 

for(list<int>::iterator it = adj.begin(); it != end; ++it) { 
    cout << *it << " "; 
} 
Смежные вопросы