[英]Compare vector<T>::iterator with vector<T>::reverse_iterator
我正在做一个练习,我有一个向量,我正在编写我自己的反向算法,使用反向和正常(正向)迭代器来反转向量的内容。 但是,我无法比较迭代器。
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
。
您可以通过调用base()
将reverse_iterator
转换为iterator
。
但是要小心,因为有一些警告。 @Matthieu M. 的评论特别有帮助:
注意:
base()
实际上返回一个iterator
,指向reverse_iterator
指向的元素之后的元素。
您可以使用(&*start == &*(end - 1))
直接比较迭代器指向的地址。
这两种类型无法进行比较(这是一个非常好的主意)并且在我看来调用.base()
不是很优雅(或通用)。 您可以转换类型并比较结果。 考虑到涉及reverse_iterators
的一对一规则。
从iterator
到reverse_iterator
转换需要是显式的(幸运的是),但是,从 reverse_iterator 到 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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.