我怎么知道迭代器的自减量超过了向量的开头

How do I know if my iterator was decremented past the beginning of my vector?

本文关键字:过了 向量 开头 迭代器 我怎么知道      更新时间:2023-10-16

我正在通过vector前后移动iterator

我可以检查迭代器是否在末尾运行,像这样:

++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?
}

这两个例子都合乎逻辑吗?

我想知道如果您使用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);
}

可以使用my_vector.rend()和myvector.rbegin()

实际上不能,但是可以使用reverse_iterator来反向遍历同一个向量。