2014-11-05 111 views
3

这不是如何将reverse_iterator转换为iterator的副本,因为我希望结果与正常转换不同。将rend迭代器转换为结束迭代器

鉴于仅是从rend返回reverse_iterator,是否有可能将其转换为将来自end返回相应iterator

例如

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

如果这是不可能做到的仅此reverse_iterator给出的,什么是做到这一点所需的最低限度的信息? (所以我可以考虑解决方法)。

+3

我认为除了'rend'迭代器之外,做这件事的最小信息是从开始到结束的距离。即容器的大小。 – user2079303 2014-11-05 12:43:36

+0

'rend()'和'end()'之间没有关系。重建'end()'所需的最少信息是'end()'。 – 2014-11-05 12:47:41

+0

@ n.m。或'size()' – 2014-11-05 12:49:32

回答

9

短的答案:否
迭代器是指容器中的一个单一点,而没有对容器本身的实际知识。由end()rend()返回的迭代器指向容器的不同端,即不管其中一个迭代器的反向性质如何,它们之间可能会有一些,多个或没有它们所指的点之间的元素。因此,在不知道容器本身或至少它的大小的情况下,不可能从容器的一端到另一端,并且因为迭代器不具有这些知识,所以不可能从rend()end() ,从end()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获得的大小,但仅仅从容器本身,你可以很容易地问它为end()在第一位。

-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(代替templetae参数int你可以使用任何类型T>

#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() 
+5

这不是问题的答案。问题是关于'rend()'和'end()'之间的关系,而不是'rend()'和'begin()'之间的关系。 – 2014-11-05 12:36:34