Как новичок, я пытаюсь реализовать функцию сортировки на 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.
Есть ли у кого-нибудь предложения?
Изменено «компиляция кода» на «выполнение кода». Я получил ту же ошибку, когда Бег его код в VS2k8. VS по умолчанию выполняет множество дополнительных проверок и проверок границ на итераторах, что и выявляет ошибку, с которой он столкнулся.
Хорошо, ребята, спасибо, что нашли ошибку, но что это должно быть вместо list1.pop_front? list1.pop_back?





Я также смог скомпилировать опубликованный код с 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 () удаляет элемент, на который итератор указывает изначально, делая его недействительным. И недопустимый итератор не может быть увеличен. :)
Поиск с помощью отладчика занял несколько минут. Просто следите за ценностью «этого» по мере выполнения программы. Я не знаю, знаете ли вы, как использовать отладчик, но если нет, сделайте себе одолжение и изучите его. Это бесценный инструмент.
(Кстати, в будущем, пожалуйста, четко указывайте, возникает ли ошибка во время компиляции или во время выполнения программы. В вашем вопросе говорилось, что ошибка произошла при «компиляции программы». Я только что отредактировал вопрос для вас, надеюсь, вы не против. Но это важное различие, из-за которого точный ответ на ваш вопрос сложнее)
Хорошо, извини, что рассказал, где что-то пошло не так. Следует следить за этим. Но как настроить программу, единственное, что я знал
Что ж, простое исправление - это удалить «it ++» из цикла for и вместо этого сделать это непосредственно перед pop_front (), чтобы итератор указывал на элемент, следующий за тем, который вы открываете. Между прочим, предпочитаю ++ это над этим ++. :)
@jalf - хороший улов. Я даже не смотрел на код, кроме как заставить его скомпилировать (добавив фиктивную функцию print ()). Думаю, просто ленивый.
Но я не могу удалить элемент цикла for! В цикле for всегда должен быть элемент. Или мне нужно изменить его на цикл while?
Нет, вы можете удалить это. "for (it = list1.begin (); it! = list1.end ();)" совершенно законно. Фактически, все три «части» цикла for могут быть пустыми. for (;;) - это идиоматический способ написать бесконечный цикл, например ("while (true)" дает предупреждение нескольким компиляторам, for (;;) - нет)
Предполагая, что jalf прав, могу ли я просто сказать, что я понял «компилируя код, я получаю ошибку ...», что означает, что у вас есть ошибка компилятора, а не то, что он скомпилирован, но затем вы получили ошибку при его запуске.