我怎么知道迭代器的自减量超过了向量的开头
How do I know if my iterator was decremented past the beginning of my vector?
我正在通过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来反向遍历同一个向量。
相关文章:
- 使用 std::istream_iterator 时,它似乎跳过了空文件行 - 如果可能的话,如何避免这种情况?
- C++ For Loop在过程中被跳过了.如何解决?
- C++跳过了辛线
- 如何在我的代码中修复无穷循环?我认为它跳过了第二个CIN,因此它一直在循环
- QT Qtimeline跳过了第一个框架
- 输入后,我的程序似乎跳过了第一个IF语句,直接转到ELSE
- C RLE BMP压缩跳过了最后一个字节
- 提升单元测试似乎跳过了应执行的代码
- C 将数据读取到一个结构,但它跳过了我的一个获取线,使该元素空白
- 如果返回了向量的一个项,lambda表达式的返回类型是什么
- 为什么我的程序跳过了一个步骤
- 当我采用测试用例数 = 1 时,我的程序终止.其他明智的是,它给出了正确的答案,但跳过了最后一个测试用例
- 为什么我的代码跳过了这个循环
- 请解释:在 for 循环之后跳过了行
- C++编译器似乎跳过了代码行
- 跳过了 int* 的琐碎分配
- GLSL交错似乎在3DTV上甚至跳过了行
- std::basic_regex<char32_t>,有人已经尝试过了吗?
- 我可以使用' == '来比较两个向量吗?我试过了,似乎工作正常。但我不知道它是否适用于更复杂的情况
- c++ cin.Getline似乎被跳过了