我在锻炼的工作,我有一个载体,我通过使用反向和正常(向前)迭代扭转矢量的内容写我自己的逆向算法。 不过,我不能够比较迭代器。
int vals[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
vector<int> numbers(vals, vals + 10);
vector<int>::iterator start = numbers.begin();
vector<int>::reverse_iterator end = numbers.rend();
我有一个以前的算法使用两个迭代器倒车载体,然而,在这个任务我不能够使用它们之间!=运算符对它们进行比较。 我的猜测是让彼此的矢量的根本指针或索引,但我如何才能指针/索引?
做使用返回的迭代器的比较base()
it == rit.base() - 1
。
您可以将转换reverse_iterator
以iterator
通过调用base()
不过要小心,因为有一些注意事项。 @Matthieu M.的评论是特别有帮助:
注意: base()
实际上返回一个iterator
的元件,该元件以下 reverse_iterator
被指向。
结帐http://en.cppreference.com/w/cpp/iterator/reverse_iterator/base
rit.base()
返回一个“正常”的迭代器。
您可以使用(&*start == &*(end - 1))
直接比较迭代器所指向的地址。
这两种类型所不能比拟的(这是一个非常好的主意),并调用.base()
在我看来是不是很优雅(或通用)。 您可以转换的类型和比较的结果。 考虑到涉及的off-by-一个规则reverse_iterators
。
从转换iterator
到reverse_iterator
需要是明确的(幸运),然而,从reverse_iterator的迭代器来转换是不可能的(很遗憾)。 所以,只有一种方式做转换,然后进行比较。
std::vector<double> vv = {1.,2.,3.};
auto it = vv.begin();
auto rit = vv.rend();
// assert( it == rit ); // error: does not compile
assert(std::vector<double>::reverse_iterator{it} == rit);