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

итераторы в list - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
bounce
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 21
09.05.2013, 18:34     итераторы в list #1
привет, подскажите как реализовать поиск c двумя циклами в списке:
C++
1
2
3
4
5
for (list <Mc*>::iterator i = myList.begin (); i != myList . end () - 1; i++)
        for (list <Mc*>::iterator j = i + 1; j != myList . end (); j++)
        {
 
        }
как заменить i + 1 и i - 1?
и если из списка удаляется элемент, как потом восстановить итератор, что бы заново можно было кусок кода выше выполнить?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
09.05.2013, 19:20     итераторы в list #2
Примерно так:
C++
1
2
3
4
5
for (list<Mc *>::iterator i = myList.begin(), next = std::next(i); next != myList.end(); ++i, ++next)
   for (list<Mc *>::iterator j = next; j != myList.end(); ++j)
   {
 
   }
Добавлено через 2 минуты
Если нет std::next:
C++
1
2
3
4
5
for (list<Mc *>::iterator i = myList.begin(), next = i; ++next != myList.end(); ++i)
   for (list<Mc *>::iterator j = next; j != myList.end(); ++j)
   {
 
   }
Добавлено через 2 минуты
Цитата Сообщение от bounce Посмотреть сообщение
и если из списка удаляется элемент, как потом восстановить итератор
erase возвращает итератор на следующий элемент:
C++
1
it = list.erase(it);
bounce
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 21
10.05.2013, 00:18  [ТС]     итераторы в list #3
спасибо. первое работает, а второе не правильно описал проблему. почему-то само заработало

Добавлено через 4 часа 10 минут
елки, таки не работает. после
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for (list <Lorenz *>::iterator i = sList.begin (), next = i; ++next != sList . end (); ++i)
{
    t1 = (*i) -> GetCurCoord ();
    for (list <Lorenz *>::iterator j = next; j != sList . end (); ++j)
    {
        t2 = (*j) -> GetCurCoord ();
        if (t1 [0] == t2 [0] &&
             t1 [1] == t2 [1] &&
             t1 [2] == t2 [2])
        {
            (*j) -> SetAdhesion (true);
            adTemp--;
        }
    }
}
не выполняется такой код
C++
1
2
3
4
5
for (list <Lorenz *>::iterator i = sList . begin (); i != sList . end (); ++i)
{
    if ((*i) -> GetAdhesion () == true)
        i = sList . erase (i);
}
говорит "expression: list iterator not incrementable". как исправить?
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
10.05.2013, 00:27     итераторы в list #4
Видимо так:
C++
1
2
3
4
5
6
7
for (list<Lorenz *>::iterator i = sList.begin(); i != sList.end(); ) {
   if ((*i)->GetAdhesion()) {
      i = sList.erase(i);
   } else {
      ++i;
   }
}
Добавлено через 2 минуты
Цитата Сообщение от bounce Посмотреть сообщение
говорит "expression: list iterator not incrementable"
erase возвращает указатель на следующий элемент, так что при удалении доп. инкремент явно лишний.
bounce
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 21
10.05.2013, 00:30  [ТС]     итераторы в list #5
от я глупый
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
10.05.2013, 00:33     итераторы в list #6
Вообще думаю можно заменить на такое (на память):
C++
1
sList.remove_if(std::mem_fun(&Lorenz::GetAdhesion));
Добавлено через 26 секунд
mem_fun в <functional>
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2013, 00:51     итераторы в list
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
bounce
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 21
10.05.2013, 00:51  [ТС]     итераторы в list #7
мне пока не до экспериментов таких(
Yandex
Объявления
10.05.2013, 00:51     итераторы в list
Ответ Создать тему
Опции темы

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