2013-05-18 161 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 << " "; 
} 
相关问题