4

作为一个新手,我正在尝试使用列表类在 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.js 文件下。

有人有什么建议吗?

4

3 回答 3

13

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

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

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

于 2008-12-02T19:34:15.737 回答
0

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

#include <list>
using namespace std;
于 2008-12-02T19:30:57.507 回答
0

这是我的主要内容:

> 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),我会弹出一个列表迭代器不可递增的弹出窗口

于 2008-12-02T19:33:55.423 回答