繁体   English   中英

比较向量<T> ::带有向量的迭代器<T> ::反向迭代器

[英]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指向的元素之后的元素。

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

rit.base()

返回一个“普通”迭代器。

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

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

iteratorreverse_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM