Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Казаков Игорь
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 34
1

Список

21.07.2013, 10:54. Просмотров 829. Ответов 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- возвращает нужное поле
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2013, 10:54
Ответы с готовыми решениями:

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

3 класса: список, стек(как список), очередь(как список)
препод дал задание: написать 3 класса (список, стек, очередь), методы: вывод,...

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

Вводится число N. Создать список его делителей и вывести список на экран
#include<iostream> #include<stdio.h> #include<malloc.h> #include<string.h>...

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

29
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 11:05 2
Может не надо обновлять итератор?
C++
1
/*it = */machine.erase(it);
Добавлено через 5 минут
Хотя нет.. судя по всему это не исправит ошибку.
0
Kuzia domovenok
2406 / 2124 / 512
Регистрация: 25.03.2012
Сообщений: 7,644
Записей в блоге: 1
21.07.2013, 11:16 3
нужен не erase, а remove
http://cpp.com.ru/meyers/ch1.html#t23

Добавлено через 8 минут
кроме того, как вариант рассмотри возможность использования list::remove_if
0
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 11:19 4
Стоп. Нет никакой проблемы. Все работает прекрасно, и должно так работать.
Чего-то ты нам не договариваешь.
0
alsav22
5442 / 4837 / 831
Регистрация: 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;
    }   
}
0
Kuzia domovenok
2406 / 2124 / 512
Регистрация: 25.03.2012
Сообщений: 7,644
Записей в блоге: 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
туплю... просто вспомнил совет мейерса... а он там немного по другому поводу.

0
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 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;
        }
0
Kuzia domovenok
2406 / 2124 / 512
Регистрация: 25.03.2012
Сообщений: 7,644
Записей в блоге: 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++){
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.07.2013, 11:58 9
Цитата Сообщение от lazybiz Посмотреть сообщение
Только я все равно не пойму, почему вы все-таки настаиваете на том, что тут вообще имеет место ошибка?
Если erase возвращает итератор на следующий элемент, то далее, в цикле, он сразу инкременируется и получается, что следующий, после удалённого элемент, вообще пропускается.
0
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 11:59 10
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
по-моему авто это какая то левая нестандартная возможность для итераторов.
auto - попросту автоматический тип, определяемый на этапе компиляции.
Можно конечно же и так написать: list<int>::iterator it = machine.begin();
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.07.2013, 12:02 11
При удалении последнего, erase() вернёт end, в цикле будет уже end + 1, выхода из цикла не будет.
0
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 12:04 12
alsav22, согласен, но на практике такого не происходит (по крайней мере у меня).
0
Kuzia domovenok
2406 / 2124 / 512
Регистрация: 25.03.2012
Сообщений: 7,644
Записей в блоге: 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, согласен, но на практике такого не происходит (по крайней мере у меня).
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.07.2013, 12:06 14
Цитата Сообщение от lazybiz Посмотреть сообщение
alsav22, согласен, но на практике такого не происходит (по крайней мере у меня).
Я не проверял, но как такое может быть?
0
lemegeton
2934 / 1363 / 467
Регистрация: 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());
}
0
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 12:06 16
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Таки спецификатор класса памяти это.
А ты понимаешь что это значит?
0
Kuzia domovenok
2406 / 2124 / 512
Регистрация: 25.03.2012
Сообщений: 7,644
Записей в блоге: 1
21.07.2013, 12:12 17
Цитата Сообщение от lazybiz Посмотреть сообщение
А ты понимаешь что это значит?
несомненно.
а) как минимум не сработает такое
C
1
2
auto i=0;//не работает
auto int j=0;//работает
Ну и этот спецификатор действительно редко используется, т.к. при объявлении локальных переменных эти записи всё равно эквивалентны.
C
1
2
3
4
void foo(){
int i;
auto int i;//можно и так объявить
}
0
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 12:13 18
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
auto i=0;//не работает
Да неужели?
0
Kuzia domovenok
2406 / 2124 / 512
Регистрация: 25.03.2012
Сообщений: 7,644
Записей в блоге: 1
21.07.2013, 12:16 19
Цитата Сообщение от lazybiz Посмотреть сообщение
А ты понимаешь что это значит?
а ты понимаешь, что значит "класс памяти"?
Есть два класса памяти: статический и автоматический. Автоматические объекты локальны и исчезают после выхода из блока.
Статические - нет.
Например, можно использовать статическую переменную для подсчёта количества вызовов фунуции.
C
1
2
3
4
5
6
7
void foo(){
static int cnt=0;
auto int tmp=0;//tmp всегда будет сбрасываться в 0
cnt++;
tmp++;
printf("cnt=%d tmp=%d", cnt, tmp);
}
0
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
21.07.2013, 12:26 20
Открою для тебя один секрет, начиная со стандарта С++11 auto не имеет семантику спецификатора класса памяти, а является просто ключевым словом.
Почитай на досуге: http://en.cppreference.com/w/cpp/language/auto

Добавлено через 3 минуты
Заодно обращаю твоё внимание на то, что судя по теме, ТС использует именно стандарт С++11.
0
21.07.2013, 12:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2013, 12:26

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

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

Двусвязный список (в конец двусвязного списка добавить другой список)
здравствуйте, подскажите пожалуйста, как в конец двусвязного списка добавить...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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