我正在进行一项练习,我有一个向量,我正在编写自己的反向算法,使用反向和正常(前向)迭代器来反转向量的内容。但是,我无法比较迭代器。
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();
我有一个先前的算法,通过使用两个迭代器来反转向量,但是在这个任务中我无法使用它们之间的!=运算符来比较它们。我的猜测是在向量中相互获取底层指针或索引但是如何获得指针/索引?
答案 0 :(得分:15)
使用base()
返回的迭代器进行比较:it == rit.base() - 1
。
答案 1 :(得分:5)
您可以致电base()
将reverse_iterator
转换为iterator
。
但请注意,因为有一些警告。 @Matthieu M.的评论特别有帮助:
注意:
base()
实际上会向后面的元素返回iterator
reverse_iterator
指向的元素。
答案 2 :(得分:3)
答案 3 :(得分:0)
您可以使用(&*start == &*(end - 1))
直接比较迭代器指向的地址。
答案 4 :(得分:0)
这两种类型无法比较(这是一个很好的主意),在我看来,调用.base()
并不是很优雅(或通用)。
您可以转换类型并比较结果。
考虑到涉及reverse_iterators
的一次性规则。
从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);