我有一个对象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 :(得分:5)
我重载了括号运算符,以便
G[i]
返回list<int>
确保operator []
的返回类型为list<int>&
,而不是list<int>
。否则,每次致电G[2]
时都会在返回时创建副本,因此永远无法访问G[2].end()
。
如果您调用[]
一次,就像在adj
的第一个代码片段中所做的那样,问题将不会显示(尽管列表将被复制两次 - 一次在{{ 1}},再一次在赋值运算符中)。第二个片段通过多次调用return
运算符来揭示问题。
答案 1 :(得分: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 << " ";
}