Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Манипуляции с итератором. Частые инкремерты, декременты 
V
    Опции темы
rudvil
Дата 4.10.2010, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Есть список(чисто пример, на самом деле там структуры)
Код
std::list<int> my_list;

Далее, происходит следующее
Код
  typedef std::list<int>::iterator iter;
  iter begin = my_list.begin();
  iter end = my_list.end();
  for (; begin != end; ++begin) {
    if (*begin == 123) { // просто ради примера
      ++begin; // переходим на следующий елемент
      if (begin != end) { // если не конец
        if (*begin == 456) { // опять же просто пример
          --begin; // возвращаемся назад
          do_something(*begin); // работаем с елементом
          ++begin; // идем опять на 1 вперед
        }
      }
      --begin; // что-бы не произошло, мы возвращаемся на элемент с которого начинали эту итерацию
    }
  }

Смущают
Цитата(code)
++begin
--begin

Пока я захожу вперед на 1 елемент(попутно проверив не конец ли это) и потом перехожу обратно на предыдущий, все вроде нормально.
Но если понадобится зайти на 2, 3, 5, 10 елементов вперед/назад, то будет очень некрасиво писать так
Цитата
++begin
++begin
++begin
++begin
...
--begin
--begin
--begin
--begin

--------------------
xor
PM MAIL Skype   Вверх
azesmcar
Дата 4.10.2010, 15:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



PM   Вверх
rudvil
Дата 4.10.2010, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Цитата(azesmcar @ 4.10.2010,  15:10)
std::advance

Спасибо, но минус в том что std::advance всего лишь
Код
template<typename _InputIterator, typename _Distance>
inline void
__advance(_InputIterator& __i, _Distance __n, input_iterator_tag) {
  // concept requirements
  __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
  while (__n--)
    ++__i;
}

Т.е. все равно придется вручную проверять не наступил ли конец после std::advance и также придется искать после какого сдвига наступил конец, если в контейнере оказалось 5 елементов, а я сделал std::advance например на 10.

Это сообщение отредактировал(а) rudvil - 4.10.2010, 15:31
--------------------
xor
PM MAIL Skype   Вверх
azesmcar
Дата 4.10.2010, 15:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(rudvil @  4.10.2010,  15:29 Найти цитируемый пост)
Все равно придется вручную проверять не наступил ли конец после advance и также придется искать после какого сдвига наступил конец. 

а что он собственно должен делать если наступил конец? и откуда ему про этот конец вообще знать? он знает только про итератор. Напиши свою функцию и передавай в нее также end().
PM   Вверх
rudvil
Дата 4.10.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 1
Всего: 3



Цитата(azesmcar @ 4.10.2010,  15:34)
Цитата(rudvil @  4.10.2010,  15:29 Найти цитируемый пост)
Все равно придется вручную проверять не наступил ли конец после advance и также придется искать после какого сдвига наступил конец. 

а что он собственно должен делать если наступил конец? и откуда ему про этот конец вообще знать? он знает только про итератор. Напиши свою функцию и передавай в нее также end().

Вы правы, остановился пока на таком варианте, если все прошло гладко, получим -1, иначе получим число после которого наступил конец.
http://liveworkspace.org/code/699a580b1b8e...fdc9e25dbabac59
--------------------
xor
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1070 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.