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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
robober
21 / 21 / 2
Регистрация: 18.01.2010
Сообщений: 41
#1

Итераторы - C++

24.12.2010, 18:53. Просмотров 1272. Ответов 10
Метки нет (Все метки)

При удалении элемента из списка (list) - ошибка list iterator not decrementable
Что делать?

C++
1
2
    for(Iter = npc.begin(); Iter != npc.end(); Iter++)
        delete (*Iter);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2010, 18:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Итераторы (C++):

Итераторы и обратные итераторы - C++
У вектора есть два типа итераторов, обычные и обратные итераторы произвольного доступа... Обычные реализовал, осталось обратные. Решил...

Итераторы в C++ - C++
Помогите плз решить 2 задачи Задача 1 Напишите программу, использующую итераторы при чтении последовательности строк со стандартного...

Итераторы - C++
Не могу въехать как работают итераторы, литература-форумы не помогли, увы. На 26й строке то, что не могу осилить. Прохожу по стеку...

итераторы - C++
ребят помогите плиз vector<double>::iterator t = matrix.begin(); vector<double>::iterator t1 = matrix.end(); for(;t<t1;t++) ...

Итераторы С++ - C++
Как с помощью итераторов работать с массивом объектов класса? И что такое класс Итератор? П.С. Не через вектора

Итераторы - C++
Добрый день! Начал изучать классы в C++ параллельно с итераторами. Решил сделать простенькую программу, которая создаёт список классов....

10
ISergey
Maniac
Эксперт С++
1375 / 886 / 52
Регистрация: 02.01.2009
Сообщений: 2,661
Записей в блоге: 1
24.12.2010, 19:05 #2
Больше кода покажи.
0
robober
21 / 21 / 2
Регистрация: 18.01.2010
Сообщений: 41
24.12.2010, 19:17  [ТС] #3
Объявление:

C++
1
2
        list <Sprite *> npc;
        list <Sprite *>::iterator Iter;
Движение чуваков:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    int xpos = (int)(pos.x + x);
    int ypos = (int)(pos.y + y);
 
    if(isValidLevelMove(xpos, ypos))
    {
        list <Sprite *>::iterator Iter;
 
        for(Iter = level->npc.begin(); Iter != level->npc.end(); Iter++)
        {
                if((*Iter != this && (int)(*Iter)->getX() == xpos && (int)(*Iter)->getY() == ypos))
                {
                    return false;
                }
        }
        erase(pos.x, pos.y);
 
        pos.x += x;
        pos.y += y;
 
        facingDirection.x = x;
        facingDirection.y = y;
 
        draw(pos.x, pos.y);
 
        if((int)goal->getX() == xpos && (int)goal->getY() == ypos)
        {
            goal->addLives(-1);
        }
 
        return true;
    }
    return false;
Обстрел чуваков:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if(Sprite::move(facingDirection.x, facingDirection.y))
    {
        list <Sprite *>::iterator Iter;
 
        for (Iter = level->npc.begin(); Iter != level->npc.end(); Iter++)
        {
            if((*Iter)->classID != classID && (int)(*Iter)->getX() == (int)pos.x && (int)(*Iter)->getY() == (int)pos.y)
            {
                (*Iter)->addLives(-1);
                addLives(-1);
            }
        }
    }
    else
        addLives(-1);
Смерть чуваков:
C++
1
2
    for(Iter = npc.begin(); Iter != npc.end(); Iter++)
        delete (*Iter);
0
ISergey
Maniac
Эксперт С++
1375 / 886 / 52
Регистрация: 02.01.2009
Сообщений: 2,661
Записей в блоге: 1
24.12.2010, 19:34 #4
хм.. странно..
так попробуй..
C++
1
2
for(std::list<Sprite*>::iterator i = npc.begin(); i != npc.end(); ++i)
        delete *i;
0
robober
21 / 21 / 2
Регистрация: 18.01.2010
Сообщений: 41
25.12.2010, 11:02  [ТС] #5
завтра отпишусь

Добавлено через 15 часов 8 минут
Нет, это не поможет
Я не могу понять почему не декрементируется.
Ошибка вылетает только когда последнего убиваешь!
Значит остается один элемент, но ведь это не проблема.
может проверку сделать?

Добавлено через 18 минут
Блин из-за чего такое может быть?
У меня ничего не получается
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
25.12.2010, 13:08 #6
Полагаю лучше erase использовать...
0
robober
21 / 21 / 2
Регистрация: 18.01.2010
Сообщений: 41
25.12.2010, 17:34  [ТС] #7
Нет erase не катит, я полагаю другие проблемы возникнут.

Добавлено через 1 минуту
Хотя можно переписать, попробую erase, отпишусь позже!
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
25.12.2010, 22:19 #8
А кстати... Если полная очистка списка идет... Почему бы не npc.clear()?
0
sandye51
программист С++
684 / 586 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
25.12.2010, 22:21 #9
какой-то извращенский способ удалять по указателю
присоединяюсь к ForEveR
0
ISergey
Maniac
Эксперт С++
1375 / 886 / 52
Регистрация: 02.01.2009
Сообщений: 2,661
Записей в блоге: 1
25.12.2010, 22:34 #10
ForEveR, sandye51, erase() и clear() удалят элементы списка, но не сами объекты!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <list>
 
class Bar{
    int i;
public:
    Bar(int a) :i(a) { 
        std::cout << "Bar( " << i << " )\n"; 
    }
    ~Bar() { 
        std::cout << "~Bar( " << i << " )\n";
    }
};
int main()
{
    std::list<Bar*> lst;
    std::list<Bar*>::iterator iter;
 
    for(int i = 0; i < 5; ++i)
        lst.push_back( new Bar(i) );
 
    lst.erase( lst.begin() );
 
    for(iter = lst.begin(); iter != lst.end(); ++iter)
        delete *iter;
 
    return 0;
}
http://codepad.org/aAgm1Dfy
2
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
25.12.2010, 22:41 #11
ISergey, Хм. Тогда да. Не прав.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2010, 22:41
Привет! Вот еще темы с ответами:

Итераторы - C++
От какого класса наследуются итераторы в STL? Например я создаю класс и для него нужен собственный итератор, совместимый с STL (более...

Итераторы С++ - C++
Помогите, пожалуйста, надо написать две программы Задача 1 Напишите программу, использующую итераторы при чтении последовательности...

Итераторы - C++
Как указать не на следующий за последним элемент последовательности, а на последний! end() - следующий за последним Добавлено через...

итераторы си++ - C++
подскажите пожалуйста какие существуют методы итераторов? и что они делают?


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

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

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