【问题标题】:List iterator not incrementable error message in C++C++ 中的列表迭代器不可递增错误消息
【发布时间】:2010-09-25 00:09:57
【问题描述】:

作为一个新手,我正在尝试使用列表类在 C++ 中实现排序功能。 但是,运行代码我得到列表迭代器不可递增的错误......但是它似乎不太可能,因为它应该是可递增的!

代码:

void shuffle (list<int> &list1)
{
    list<int> smaller;
    list<int> larger;

    if (list1.size() > 1)
    {
        list<int>::iterator it;
        //int it;

        int x = list1.front();


        for (it = list1.begin(); it != list1.end(); it++)
        {                                       
            if(*it <= x)
            {
                smaller.push_front(*it);
                list1.pop_front();

            }
            else
            {
                larger.push_back(*it);
                list1.pop_front();
            }
            shuffle (smaller);
            shuffle (larger);
        }
    }
    else
    {
        print(smaller);
        print(larger);

        //cout << "No sorting needed! The list still looks like: ";
        //print(list1);
    }
    print(smaller);     
    print(larger);
}

我只是在 de CPP 文件中实现了这个功能,在 main 下。

有人有什么建议吗?

【问题讨论】:

  • 假设 jalf 是正确的,我可以说我理解“编译代码,我得到错误......”意味着你得到一个编译器错误,而不是它编译但你得到一个运行时出错。
  • 将“编译代码”更改为“运行代码”。在 VS2k8 中运行他的代码时,我得到了完全相同的错误。 VS 默认对迭代器执行大量额外的验证和边界检查,这就是他遇到的错误。
  • 好的,感谢您发现错误,但它必须是什么而不是 list1.pop_front? list1.pop_back?

标签: c++ list iterator


【解决方案1】:

您对 list1.pop_front() 的调用会删除迭代器最初指向的元素,使其无效。并且无效的迭代器不能递增。 :)

使用调试器需要几分钟才能找到。在您逐步完成程序时,请注意“它”的价值。我不知道您是否知道如何使用调试器,但如果不知道,请帮自己一个忙并学习它。这是一个非常宝贵的工具。

(顺便说一句,以后请明确说明错误是在编译时发生还是在运行程序时发生。您的问题是在“编译程序”时发生错误。我刚刚为您编辑了问题,希望您不要介意。但这是一个重要的区别,并且更难准确回答您的问题)

【讨论】:

  • 好的,很抱歉告诉你哪里出了问题。应该关注它。但是如何调整程序,我唯一的想法
  • 嗯,一个简单的解决方法是从 for 循环中删除“it++”,而是在 pop_front() 之前执行此操作,因此迭代器指向您要弹出的元素之后的元素。顺便说一句,更喜欢 ++it 而不是它++。 :)
  • @jalf - 很好。我什至没有看代码,只是让它编译(添加一个虚拟的 print() 函数)。我猜只是懒惰。
  • 但是我不能删除for循环的元素! for 循环中总是必须有一个元素。还是我必须将其更改为 while 循环?
  • 不,你可以删除它。 “for (it = list1.begin(); it != list1.end();)” 是完全合法的。事实上,for 循环的所有三个“部分”都可能是空的。 for(;;) 是编写无限循环的惯用方式,例如 ("while(true)" 会在多个编译器上发出警告,for(;;) 不会)
【解决方案2】:

在我注释掉对 print() 的调用并将以下内容添加到开头之后,我还能够使用 VS2008 编译发布的代码:

#include <list>
using namespace std;

【讨论】:

    【解决方案3】:

    这是我的主要内容:

    > int _tmain(int argc, _TCHAR* argv[])
    {
    //DEFINE LIST
    list <int> list1;
    //FILL LIST
    list1.push_front(5);
    list1.push_front(2);
    list1.push_front(1);
    list1.push_front(9);
    list1.push_front(12);
    list1.push_front(3);
    list1.push_front(4);
    //PRINT LIST BEFORE SORTING
    print(list1);
    //SORT LIST
    
    shuffle(list1);
    
    
    
    //PRINT AFTER SORTING
    
    system("pause");
    
    
    
    
    return 0;
    

    并且错误消息只有 1,即如果我调试它(​​在 VC++ 2008 中按 F5)我会弹出一个列表迭代器不可递增的弹出窗口

    【讨论】:

      猜你喜欢
      • 2011-09-04
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多