Как я узнаю, что мой итератор был уменьшен после начала моего вектора? - PullRequest
5 голосов
/ 07 сентября 2011

Я двигаюсь на iterator назад и вперед через vector.

Я могу проверить, не закончился ли итератор так:

++my_iterator;
if ( my_iterator == my_vector.end() )
{
    --my_iterator; // if I want to stop the iterator at the end.
    my_iterator = my_vector.begin(); // if I want the iterator to wraparound.
}

Но как это сделать?Я проверяю, сработало ли оно с начала?

Редактировать: Так я могу это сделать?

--my_iterator;
if ( my_iterator == my_vector.rend() )
{
    my_iterator = my_vector.begin(); // if I want to stop the iterator at the beginning.
    my_iterator = --(my_vector.rbegin()); // if I want the iterator to wraparound.
}

Или я должен это сделать?

std::vector< T >::iterator temp_reverse_iterator = reverse_iterator< T >( my_iterator );
++temp_reverse_iterator;
if ( temp_reverse_iterator == my_vector.rend() )
{
    my_iterator = my_vector.begin(); // if I want to stop the iterator at the beginning.
    my_iterator = --(my_vector.end()); // if I want the iterator to wraparound.
}
else
{
    my_iterator = temp_reverse_iterator.base(); // do I need to -- this?
}

Иоба эти примера логически обоснованы?

Ответы [ 3 ]

5 голосов
/ 07 сентября 2011

Вы можете использовать my_vector.rend () и myvector.rbegin ()

4 голосов
/ 07 сентября 2011

Интересно, было бы вам проще, если бы вы использовали Boost Circular Buffer вместо std::vector в качестве базовой структуры данных.: Вы проверяете на предмет обтекания начала, проверяя, равен ли итератор v.begin().

#include <vector>
#include <cassert>

template <class T> void
Increment( typename std::vector<T>::iterator& it, std::vector<T>& v )
{
  assert(v.size() > 0);

  ++it;
  if(it == v.end())
    it = v.begin();
}

template <class T> void
Decrement( typename std::vector<T>::iterator& it, std::vector<T>& v )
{
  assert(v.size() > 0);

  if(it == v.begin())
    it = v.end();
  --it;
}

int main() {
  std::vector<int> v;
  v.push_back(0);
  v.push_back(1);

  std::vector<int>::iterator it;

  it = v.begin();
  Decrement(it, v);
  assert(*it == 1);
  Increment(it, v);
  assert(*it == 0);
}
3 голосов
/ 07 сентября 2011

Вы не можете на самом деле, но вы можете использовать reverse_iterator для циклического обратного прохождения через тот же вектор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...