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

Why do these two segments of code give me different results?

本文关键字:结果 代码 两段 为什么      更新时间:2023-10-16

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

在我看来,他们做同样的事情。谁能解释为什么第二个代码段不工作?还有,有没有更好的方法来遍历我的列表?

我重载了括号操作符,使G[i]返回list<int>

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

如果您调用[]一次,您在第一个代码片段中使用adj的方式,问题将不可见(尽管列表将被复制两次-一次在return中,一次在赋值操作符中)。第二个片段通过多次调用[]操作符暴露了问题。

也许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 << " ";
}