25

我正在做一个练习,我有一个向量,我正在编写自己的反向算法,方法是使用反向和正常(正向)迭代器来反转向量的内容。但是,我无法比较迭代器。

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

我有一个先前的算法,用于通过使用两个迭代器来反转向量,但是在这个任务中,我无法使用它们之间的 != 运算符来比较它们。我的猜测是获取向量中的底层指针或索引,但我如何获取指针/索引?

4

5 回答 5

21

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

于 2013-03-04T13:48:03.220 回答
8

您可以通过调用将 a 转换reverse_iterator为。iteratorbase()

但是要小心,因为有一些警告。@Matthieu M. 的评论特别有帮助:

注意:base()实际上返回一个iterator指向元素后面的元素reverse_iterator

于 2013-03-04T13:46:04.410 回答
3

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

rit.base()

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

于 2013-03-04T13:46:29.793 回答
0

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

于 2016-01-16T03:30:49.210 回答
0

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

iteratorto的转换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);
于 2018-12-10T03:47:31.497 回答