2014-11-05 104 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