【问题标题】:Dereferencing C++ STL list iterator取消引用 C++ STL 列表迭代器
【发布时间】:2011-04-27 01:08:44
【问题描述】:

我正在循环遍历两个 STL 列表(L1、L2),如下所示:

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
   }

}

它编译得很好,但是当我运行它时,它显示“表达式:列表迭代器不可取消引用”

现在在课堂上我们制作了 STL 列表的模拟版本,我们在其中编写了自己的 STL 列表,并且我们重载了 * 操作符以取消引用迭代器。但是,显然它在这里不起作用。

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

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

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

有人知道这里发生了什么吗?谢谢

这是一个pastebin:

http://pastebin.com/YRddqjmN

【问题讨论】:

  • 我对答案做了最好的猜测,但是当我编译上面的代码时,它工作得很好。您可能需要添加操作系统和编译器详细信息。
  • 发布一些完整代码以显示问题的好地方是pastebin.comcodepad.org
  • 例如,我从这里做了一个程序,并把它放在键盘上:codepad.org/JgMBNAiW
  • 我在原帖中放了一个 pastebin。再次感谢你们的帮助。
  • 粘贴的代码无法编译,但经过必要的琐碎修复后,它可以正常工作:ideone.com/EbeVt

标签: c++ list stl dereference


【解决方案1】:

此(特定于实现)消息向我表明您取消了对无效迭代器的引用。这与语法/编译时语义无关,因此您的编译器没有抱怨也就不足为奇了。但是请注意,迭代器确实具有运行时语义:在这种情况下,我敢打赌代码是用一个空的L2 列表调用的,所以itr2 == L2.end()。这意味着 *itr2 会导致未定义的行为。幸运的是,这似乎会触发错误消息,而不是在您的脸上炸毁。

【讨论】:

    【解决方案2】:

    我的猜测:

    L2 为空,因此L2.begin()L2.end() 相同。

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

    【讨论】:

      【解决方案3】:
      while ( *itr2 < *itr1 ) {
          itr2++;
      }
      

      该代码没有检查是否在 L2 末尾运行。或许可以为 itr2 != L2.end() 添加支票。

      【讨论】:

      • 你说得对,我忘了那张支票,谢谢,谢谢大家,你所有的答案都有帮助!
      • 你也不行。可以吗?
      【解决方案4】:

      只要列表不为空,标准列表迭代器就可以被取消引用,只要它在列表的范围内,即 [list.begin(), list.end())。

      【讨论】:

        【解决方案5】:

        其他答案是正确的,因为两个错误,一个坏的列表迭代器被取消引用。查看您的粘贴箱,

        这个条件是倒退的:

        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,它是标准库的一部分吗?)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-05
          • 2011-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-24
          相关资源
          最近更新 更多