Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Манипуляции с итератором.


Автор: rudvil 4.10.2010, 15:07
Есть список(чисто пример, на самом деле там структуры)
Код
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

Автор: azesmcar 4.10.2010, 15:10
http://www.cplusplus.com/reference/std/iterator/advance/

Автор: rudvil 4.10.2010, 15:29
Цитата(azesmcar @ 4.10.2010,  15:10)
http://www.cplusplus.com/reference/std/iterator/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.

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

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

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

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

Вы правы, остановился пока на таком варианте, если все прошло гладко, получим -1, иначе получим число после которого наступил конец.
http://liveworkspace.org/code/699a580b1b8e6e1cdfdc9e25dbabac59

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)