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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
robober
21 / 21 / 2
Регистрация: 18.01.2010
Сообщений: 41
24.12.2010, 18:53     Итераторы #1
При удалении элемента из списка (list) - ошибка list iterator not decrementable
Что делать?

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

Итераторы и обратные итераторы C++
Итераторы в C++ C++
Итераторы С++ C++
Итераторы C++
C++ Итераторы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
24.12.2010, 19:05     Итераторы #2
Больше кода покажи.
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);
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
24.12.2010, 19:34     Итераторы #4
хм.. странно..
так попробуй..
C++
1
2
for(std::list<Sprite*>::iterator i = npc.begin(); i != npc.end(); ++i)
        delete *i;
robober
21 / 21 / 2
Регистрация: 18.01.2010
Сообщений: 41
25.12.2010, 11:02  [ТС]     Итераторы #5
завтра отпишусь

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

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

Добавлено через 1 минуту
Хотя можно переписать, попробую erase, отпишусь позже!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.12.2010, 22:19     Итераторы #8
А кстати... Если полная очистка списка идет... Почему бы не npc.clear()?
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
25.12.2010, 22:21     Итераторы #9
какой-то извращенский способ удалять по указателю
присоединяюсь к ForEveR
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2010, 22:41     Итераторы
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.12.2010, 22:41     Итераторы #11
ISergey, Хм. Тогда да. Не прав.
Yandex
Объявления
25.12.2010, 22:41     Итераторы
Ответ Создать тему
Опции темы

Текущее время: 16:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru