Список итераторов не допускает увеличения сообщения об ошибке в C ++ - PullRequest
4 голосов
/ 02 декабря 2008

Как новичок я пытаюсь реализовать функцию сортировки в 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, под основным.

У кого-нибудь есть предложения?

Ответы [ 3 ]

13 голосов
/ 02 декабря 2008

Ваш вызов list1.pop_front () удаляет элемент, на который изначально указывает итератор, и делает его недействительным. И недействительный итератор не может быть увеличен. :)

Потребовалось несколько минут, чтобы найти отладчик. Просто следите за значением «это», когда вы проходите через программу. Я не знаю, знаете ли вы, как использовать отладчик, но если нет, сделайте себе одолжение и изучите его. Это бесценный инструмент.

(Кстати, в будущем, пожалуйста, четко укажите, будет ли ошибка возникать во время компиляции или при запуске программы. В вашем вопросе говорилось, что ошибка произошла при «компиляции программы». Я только что отредактировал вопрос для вас Надеюсь, вы не возражаете. Но это важное различие, которое затрудняет точный ответ на ваш вопрос)

0 голосов
/ 02 декабря 2008

Это моя главная:

> 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, а именно, если я отлаживаю его (нажмите F5 в VC ++ 2008), я получаю всплывающее окно, что итератор списка не может быть увеличен

0 голосов
/ 02 декабря 2008

Мне также удалось скомпилировать опубликованный код с VS2008 после того, как я закомментировал вызовы print () и добавил в начало следующее:

#include <list>
using namespace std;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...