将vector <t> :: iterator与vector <t> :: reverse_iterator </t> </t>进行比较

时间:2013-03-04 13:44:19

标签: c++ vector stl 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();

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

5 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:5)

您可以致电base()reverse_iterator转换为iterator

但请注意,因为有一些警告。 @Matthieu M.的评论特别有帮助:

  

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

答案 2 :(得分:3)

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

rit.base()

返回一个'普通'迭代器。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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