2

我有一个对象G,它是一个图表。我重载了括号运算符,以便G[i]返回一个list<int>(STL 列表),它是一个 vertexi的邻接列表。

我有这两段代码都应该迭代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 << " ";
}

据我所知,他们做同样的事情。谁能解释为什么第二个代码段不起作用?另外,有没有更好的方法来遍历我的列表?

4

2 回答 2

5

我重载了括号运算符,以便G[i]返回一个list<int>

确保你的返回类型operator []list<int>&,不是list<int>。否则,每次调用时都会在返回时创建一个副本G[2],因此G[2].end()永远无法到达。

如果你调用[]一次,就像你在第一个代码片段中所做的那样adj,问题将不可见(尽管列表将被复制两次——一次在 中return,一次在赋值运算符中)。第二个片段通过[]多次调用操作符来暴露问题。

于 2013-05-18T01:46:33.480 回答
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 << " ";
}
于 2013-05-18T01:44:35.577 回答