比较矢量 ::与向量的迭代器 :: reverse_iterator的(Compare v

2019-08-17 07:33发布

我在锻炼的工作,我有一个载体,我通过使用反向和正常(向前)迭代扭转矢量的内容写我自己的逆向算法。 不过,我不能够比较迭代器。

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();

我有一个以前的算法使用两个迭代器倒车载体,然而,在这个任务我不能够使用它们之间!=运算符对它们进行比较。 我的猜测是让彼此的矢量的根本指针或索引,但我如何才能指针/索引?

Answer 1:

做使用返回的迭代器的比较base() it == rit.base() - 1



Answer 2:

您可以将转换reverse_iteratoriterator通过调用base()

不过要小心,因为有一些注意事项。 @Matthieu M.的评论是特别有帮助:

注意: base()实际上返回一个iterator的元件,该元件以下 reverse_iterator被指向。



Answer 3:

结帐http://en.cppreference.com/w/cpp/iterator/reverse_iterator/base

rit.base()

返回一个“正常”的迭代器。



Answer 4:

您可以使用(&*start == &*(end - 1))直接比较迭代器所指向的地址。



Answer 5:

这两种类型所不能比拟的(这是一个非常好的主意),并调用.base()在我看来是不是很优雅(或通用)。 您可以转换的类型和比较的结果。 考虑到涉及的off-by-一个规则reverse_iterators

从转换iteratorreverse_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);


文章来源: Compare vector::iterator with vector::reverse_iterator