2011-04-27 81 views
1

我循环通过两个STL列表(L1,L2),像这样:取消引用C++ STL列表迭代器

list<int>::const_iterator itr1 = L1.begin(); 
list<int>::const_iterator itr2 = L2.begin(); 

for (itr1; itr1 != L1.end(); itr1++) { 
    if (*itr1 < *itr2) { 
    //some code 
    } 

} 

它编译罚款,但是当我运行它,它说:“表达式:列表迭代器不dereferencable”

现在在课上,我们制作了一个STL列表的模拟版本,我们编写了自己的STL列表,并且我们重载了*运算符来取消引用迭代器。但是,显然这不是在这里工作。

如何取消引用迭代器,或者如果STL列表以不同的方式执行,它是如何执行的。我通过这个看:

http://www.sgi.com/tech/stl/List.html

文档和似乎没有找到任何接受会员“引用”,但仍然没有看到如何引用什么的迭代器指向,除非它是第一个或最后一个列表的一部分。

任何人都知道这里发生了什么?谢谢

这里是一个引擎收录:

http://pastebin.com/YRddqjmN

+0

我做了我最好的猜测答案,但是当我编译上面的代码只是正常工作。您可能需要添加操作系统和编译器详细信息。 – 2011-04-27 01:15:39

+0

发布一些完整的代码来显示问题的好地方是http://pastebin.com和http://codepad.org – 2011-04-27 01:18:11

+0

例如,我从此做出了一个程序,并将它放在键盘上:http:// codepad .org/JgMBNAiW – 2011-04-27 01:22:04

回答

2
while (*itr2 < *itr1) { 
    itr2++; 
} 

该代码没有检查是否运行在L2的末尾。也许增加支票itr2 != L2.end()

+0

你是对的我忘了检查,谢谢并感谢其他人,所有的答案帮助! – Ben 2011-04-27 01:39:14

+0

你不要让它继续前进。这可以吗? – geekazoid 2011-04-27 02:01:01

3

我的猜测:

L2是空的,所以L2.begin()相同L2.end()

这意味着L2.begin()返回一个不可引用的迭代器,因此调用未定义的行为。

3

这个(实现特定的)消息向我建议你解除了一个无效的迭代器。这与语法/编译时语义没有任何关系,所以你的编译器没有抱怨就不足为奇了。但是请注意,迭代器确实具有运行时语义:在这种情况下,我打赌用空的L2列表调用代码,以便itr2 == L2.end()。这意味着*itr2会导致未定义的行为。幸运的是,这似乎触发了一个错误消息,而不是放在你的脸上。

0

只要标准列表迭代器在您列表的范围内,即[list.begin(),list.end())被清除,而您的列表不为空。

0

其他答案是正确的,因为有两个错误,坏列表迭代器被解引用。看你的引擎收录,

这种情况是倒退:

if ((*itr1 == *itr2) && (itr2 != L2.end())) { 

应该

if ((itr2 != L2.end()) && (*itr1 == *itr2)) { 

,以检查itr2是使用它之前有效。此外,第一条件

if (L1.empty() && L2.empty()) { 
      cout << "Returning an empty list because the two arugment lists were empty\n\n"; 

应该是脱节:

if (L1.empty() || L2.empty()) { 
      cout << "Returning an empty list because at least one of the two argument lists was empty\n\n"; 

,但它甚至不是真的有必要。

(哦,是你知道的set_intersection,这是标准库的一部分?)