Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 34
1

Список

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

Author24 — интернет-сервис помощи студентам
написал функцию, которая удаляет звено списка, если выполняется условие( если параметр функции == полю звена), однако вылетает ошибка 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.07.2013, 10:54
Ответы с готовыми решениями:

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

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

Создать список L3 из элементов, которые входят в список L1 и не входят в список L2
Нужно создать список L3 из элементов, которые входят в список L1 и не входят в список L2, вернуть...

Создать список L3 из элементов, которые входят в список L1 и не входят в список L2
Задание : Создать список L3 из элементов, которые входят в список L1 и не входят в список L2,...

29
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.07.2013, 11:05 2
Может не надо обновлять итератор?
C++
1
/*it = */machine.erase(it);
Добавлено через 5 минут
Хотя нет.. судя по всему это не исправит ошибку.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
21.07.2013, 11:16 3
нужен не erase, а remove
http://cpp.com.ru/meyers/ch1.html#t23

Добавлено через 8 минут
кроме того, как вариант рассмотри возможность использования list::remove_if
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.07.2013, 11:19 4
Стоп. Нет никакой проблемы. Все работает прекрасно, и должно так работать.
Чего-то ты нам не договариваешь.
0
5498 / 4893 / 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
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 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
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
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
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 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
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.07.2013, 11:58 9
Цитата Сообщение от lazybiz Посмотреть сообщение
Только я все равно не пойму, почему вы все-таки настаиваете на том, что тут вообще имеет место ошибка?
Если erase возвращает итератор на следующий элемент, то далее, в цикле, он сразу инкременируется и получается, что следующий, после удалённого элемент, вообще пропускается.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.07.2013, 11:59 10
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
по-моему авто это какая то левая нестандартная возможность для итераторов.
auto - попросту автоматический тип, определяемый на этапе компиляции.
Можно конечно же и так написать: list<int>::iterator it = machine.begin();
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.07.2013, 12:02 11
При удалении последнего, erase() вернёт end, в цикле будет уже end + 1, выхода из цикла не будет.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.07.2013, 12:04 12
alsav22, согласен, но на практике такого не происходит (по крайней мере у меня).
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 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
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.07.2013, 12:06 14
Цитата Сообщение от lazybiz Посмотреть сообщение
alsav22, согласен, но на практике такого не происходит (по крайней мере у меня).
Я не проверял, но как такое может быть?
0
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
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
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.07.2013, 12:06 16
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Таки спецификатор класса памяти это.
А ты понимаешь что это значит?
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 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
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.07.2013, 12:13 18
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
auto i=0;//не работает
Да неужели?
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 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
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.07.2013, 12:26 20
Открою для тебя один секрет, начиная со стандарта С++11 auto не имеет семантику спецификатора класса памяти, а является просто ключевым словом.
Почитай на досуге: http://en.cppreference.com/w/cpp/language/auto

Добавлено через 3 минуты
Заодно обращаю твоё внимание на то, что судя по теме, ТС использует именно стандарт С++11.
0
21.07.2013, 12:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.07.2013, 12:26
Помогаю со студенческими работами здесь

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru