为什么这两段代码会给我不同的结果?

时间:2013-05-18 01:42:24

标签: c++ list iterator

我有一个对象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 << " ";
}

据我所见,他们做同样的事情。任何人都可以解释为什么第二个代码段不起作用?还有,有更好的方法来迭代我的列表吗?

2 个答案:

答案 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 << " ";
}