Сообщение об ошибке итератора списка не увеличивается в C++

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

Я реализовал эту функцию только в файле CPP, в файле main.

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

Предполагая, что jalf прав, могу ли я просто сказать, что я понял «компилируя код, я получаю ошибку ...», что означает, что у вас есть ошибка компилятора, а не то, что он скомпилирован, но затем вы получили ошибку при его запуске.

Steve Jessop 02.12.2008 22:37

Изменено «компиляция кода» на «выполнение кода». Я получил ту же ошибку, когда Бег его код в VS2k8. VS по умолчанию выполняет множество дополнительных проверок и проверок границ на итераторах, что и выявляет ошибку, с которой он столкнулся.

jalf 02.12.2008 22:39

Хорошо, ребята, спасибо, что нашли ошибку, но что это должно быть вместо list1.pop_front? list1.pop_back?

Chris Jester-Young 02.12.2008 22:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
3
11 605
3

Ответы 3

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

#include <list>
using namespace std;

Это мой главный:

> 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), я получаю всплывающее окно, что итератор списка не увеличивается

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

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

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

Хорошо, извини, что рассказал, где что-то пошло не так. Следует следить за этим. Но как настроить программу, единственное, что я знал

Brian Leahy 02.12.2008 22:41

Что ж, простое исправление - это удалить «it ++» из цикла for и вместо этого сделать это непосредственно перед pop_front (), чтобы итератор указывал на элемент, следующий за тем, который вы открываете. Между прочим, предпочитаю ++ это над этим ++. :)

jalf 02.12.2008 22:44

@jalf - хороший улов. Я даже не смотрел на код, кроме как заставить его скомпилировать (добавив фиктивную функцию print ()). Думаю, просто ленивый.

Michael Burr 02.12.2008 22:45

Но я не могу удалить элемент цикла for! В цикле for всегда должен быть элемент. Или мне нужно изменить его на цикл while?

Brian Leahy 02.12.2008 22:45

Нет, вы можете удалить это. "for (it = list1.begin (); it! = list1.end ();)" совершенно законно. Фактически, все три «части» цикла for могут быть пустыми. for (;;) - это идиоматический способ написать бесконечный цикл, например ("while (true)" дает предупреждение нескольким компиляторам, for (;;) - нет)

jalf 02.12.2008 22:48

Другие вопросы по теме