将rend迭代器转换为end iteterator

时间:2014-11-05 12:22:41

标签: c++

这与如何将reverse_iterator转换为iterator并不重复,因为我希望结果与正常转化不同。

仅提供从reverse_iterator返回的rend,是否可以将其转换为从iterator返回的相应end

例如

std::vector<int> myvec = {...};
auto rit = myvec.rend();
auto it = MAGIC(rit);
it == myvec.end(); // true

如果仅在reverse_iterator的情况下无法执行此操作,那么执行此操作所需的最低信息是多少? (所以我可以考虑解决方法)。

2 个答案:

答案 0 :(得分:9)

简答:否。
迭代器指的是容器中的一个单独的点,而不是容器本身的实际知识。 end()rend()返回的迭代器指向容器的不同端,即它们引用的点之间可能存在一些,很多或没有元素,而不管其中一个迭代器的反向性质如何。因此,在不知道容器本身或至少它的大小的情况下,不可能从容器的一端到达另一端,并且由于迭代器不具备该知识,因此不可能从{ {1}}至rend()end()end()等,无其他信息。

所需的最少信息是&#34; gap&#34;的大小。两点之间。有了它以及反向和非反向迭代器之间的正常转换,这是一项简单的任务:

begin()

但是,由于您无法从auto rend = v.rend(); auto begin = rend.base(); assert(begin == v.begin()); auto end = begin + v.size(); //the size is the key! assert(end == v.end()); 获取大小,只能从容器本身获取大小,因此您可以轻松地首先询问reverse_iterator

答案 1 :(得分:-2)

表达

myvec.rend().base() 

相当于

myvec.begin()

这是一个示范性的例子

#include <iostream>
#include <vector>

int main() 
{
    std::vector<int> v = { 1, 2, 3, 4, 5 };

    std::vector<int>::iterator it = v.rend().base();

    std::cout << *it << std::endl;

    return 0;
}

输出

1

另一个显示std::vector<int>::iteratorstd::vector<int>::reverse_iterator之间关系的示范程序(而不是寺庙论证int,您可以使用任何类型T&gt;

#include <iostream>
#include <vector>

int main() 
{
    std::vector<int> v = { 1, 2, 3, 4, 5 };

    if ( v.begin() == v.rend().base() )
    {
        std::cout << "v.begin() == v.rend().base()" << std::endl;
    }

    if ( v.end() == v.rbegin().base() )
    {
        std::cout << "v.end() == v.rbegin().base()" << std::endl;
    }

    return 0;
}

输出

v.begin() == v.rend().base()
v.end() == v.rbegin().base()