Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Казаков Игорь
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 34
#1

Список - C++

21.07.2013, 10:54. Просмотров 745. Ответов 29
Метки нет (Все метки)

написал функцию, которая удаляет звено списка, если выполняется условие( если параметр функции == полю звена), однако вылетает ошибка list iterator not incrementable, когда удаляется последнее звено
C++
1
2
3
4
5
6
7
8
void CarPark::GoOutCarPark(int number)
{
    for (auto it = machine.begin(); it != machine.end(); it++)
    {
        if (number == it->GetNumber())
            it = machine.erase(it);
    }   
}
machine(список)
GetNumber- возвращает нужное поле
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2013, 10:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Список (C++):

Создать список L3 из элементов, входящих и в список L1 и в список L2 - C++
создать список л3 из элементов входящих и в список л1 и в список л2

3 класса: список, стек(как список), очередь(как список) - C++
препод дал задание: написать 3 класса (список, стек, очередь), методы: вывод, добавление, удаление. Использовать при обращении указатель...

Сформировать список из 10 книг, используя динамическую структуру данных односвязный список - C++
друзья спасайте Сформировать список из 10 книг, используя динамическую структуру данных односвязный список С++

Вводится число N. Создать список его делителей и вывести список на экран - C++
#include<iostream> #include<stdio.h> #include<malloc.h> #include<string.h> #include<stdlib.h> using namespace std; struct...

list. Cоздать список из результатов(с массивами), а потом просмотреть весь список - C++
Подскажите пожалуйста как мне создать список из моих результатов(с массивами) а потом просмотреть весь список, вот код который имеется ...

Сформировать список из 10 работников, используя динамическую структуру данных двусвязный список - C++
спасайте Сформировать список из 10 работников, используя динамическую структуру данных двусвязный список. Информация о работнике...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 11:05 #2
Может не надо обновлять итератор?
C++
1
/*it = */machine.erase(it);
Добавлено через 5 минут
Хотя нет.. судя по всему это не исправит ошибку.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
21.07.2013, 11:16 #3
нужен не erase, а remove
http://cpp.com.ru/meyers/ch1.html#t23

Добавлено через 8 минут
кроме того, как вариант рассмотри возможность использования list::remove_if
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 11:19 #4
Стоп. Нет никакой проблемы. Все работает прекрасно, и должно так работать.
Чего-то ты нам не договариваешь.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.07.2013, 11:22 #5
Может так?
C++
1
2
3
4
5
6
7
8
9
void CarPark::GoOutCarPark(int number)
{
    for (auto it = machine.begin(); it != machine.end(); it++)
    {
        if (number == it->GetNumber())
            it = machine.erase(it);
            --it;
    }   
}
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
21.07.2013, 11:33 #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Может так?
C++
1
2
3
4
5
6
7
8
9
void CarPark::GoOutCarPark(int number)
{
* * for (auto it = machine.begin(); it != machine.end(); it++)
* * {
* * * * if (number == it->GetNumber())
* * * * * * it = machine.erase(it);
* * * * * * --it;
* * } * 
}
Тогда уж так:
C++
1
2
3
4
5
6
7
8
9
10
11
void CarPark::GoOutCarPark(int number)
{
    auto it = machine.begin();
    while( it != machine.end())
    {
        if (number == it->GetNumber())
            machine.erase(it++);
        else 
            it++;
    }   
}
Добавлено через 2 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
--it;
а какой тип у it? разве итератор может быть одновременно инверсным и нет?

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
нужен не erase, а remove
http://cpp.com.ru/meyers/ch1.html#t23
туплю... просто вспомнил совет мейерса... а он там немного по другому поводу.

castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 11:47 #7
Он может быть двунаправленным, каким он и является.
Только я все равно не пойму, почему вы все-таки настаиваете на том, что тут вообще имеет место ошибка?

Добавлено через 11 минут
Хотя, правильней все же будет так:
C++
1
2
3
4
5
6
        auto it = machine.begin();
        while ( it != machine.end() ) {
            if ( number == it->GetNumber() ) {
                it = machine.erase( it );
            } else ++it;
        }
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
21.07.2013, 11:55 #8
Цитата Сообщение от lazybiz Посмотреть сообщение
Он может быть двунаправленным, каким он и является.
по-моему, авто это какая то левая нестандартная возможность для итераторов.
Я знаю, что по стандарту авто это спецификатор класса памяти. И он практически не используется, т.к. локальные переменные и так хранятся как auto без явного на то указания. (книга K&R)
Впрочем можно наверное просто так написать
C
1
2
auto int i;
for (i=; i<10; i++){
Добавлено через 5 минут
C
1
2
auto int i;
for (i=0; i<10; i++){
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.07.2013, 11:58 #9
Цитата Сообщение от lazybiz Посмотреть сообщение
Только я все равно не пойму, почему вы все-таки настаиваете на том, что тут вообще имеет место ошибка?
Если erase возвращает итератор на следующий элемент, то далее, в цикле, он сразу инкременируется и получается, что следующий, после удалённого элемент, вообще пропускается.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 11:59 #10
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
по-моему авто это какая то левая нестандартная возможность для итераторов.
auto - попросту автоматический тип, определяемый на этапе компиляции.
Можно конечно же и так написать: list<int>::iterator it = machine.begin();
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.07.2013, 12:02 #11
При удалении последнего, erase() вернёт end, в цикле будет уже end + 1, выхода из цикла не будет.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 12:04 #12
alsav22, согласен, но на практике такого не происходит (по крайней мере у меня).
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
21.07.2013, 12:05 #13
Цитата Сообщение от lazybiz Посмотреть сообщение
auto - попросту автоматический тип, определяемый на этапе компиляции.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
по стандарту авто это спецификатор класса памяти.
Таки спецификатор класса памяти это. Аналогично static, только наоборот.
C++
1
2
3
4
5
void foo(){
static int a;//спецификатор static
auto int b;//спецификатор auto
int c;//спецификатор auto по-умолчанию
}
Добавлено через 42 секунды
Цитата Сообщение от lazybiz Посмотреть сообщение
alsav22, согласен, но на практике такого не происходит (по крайней мере у меня).
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.07.2013, 12:06 #14
Цитата Сообщение от lazybiz Посмотреть сообщение
alsav22, согласен, но на практике такого не происходит (по крайней мере у меня).
Я не проверял, но как такое может быть?
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
21.07.2013, 12:06 #15
Ошибки, скорее всего, от того, что итераторы инвалидируются как попало.

Если уж вы не боитесь новых стандартов, то можно вот так сделать.
C++
1
2
3
4
5
6
7
8
9
void CarPark::GoOutCarPark(int number) {
  auto firstRemoved = std::remove_if(vector.begin(), vector.end(), 
    std::bind(
      std::equal_to<int>(),
      // тут не знаю типа данных, подставьте вместо Machine
      std::bind(&Machine::GetNumber, std::placeholders::_1),
      number));
  machine.erase(firstRemoved, machine.end());
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2013, 12:06
Привет! Вот еще темы с ответами:

Список: связный список, в котором информация о книгах сортируется по убыванию стоимости. - C++
Друзья помогите с реализацией списка. Нужно запрограммировать связный список, в котором информация о книгах сортируется по убыванию...

Необходимо создать список, элемент которого может быть список - C++
Всем доброго времени суток! Стоит следующая задача: необходимо создать список, элемент которого может быть список (да да, звучит...

Описать функцию, которая будет проверять входит ли список l1 в список l2 - C++
Здравствуйте, нужно Описать функцию, которая будет проверять входит ли список l1 в список l2. Ни как не могу понять как это сделать. ...

Упорядочить список студентов по среднему баллу и вывести весь список - C++
форумчане,выдает ошибку :( столько маюсь с задачей уже #include &lt;vcl.h&gt; #include &lt;stdio.h&gt; #pragma hdrstop /*Упорядочить список...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.07.2013, 12:06
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru