2010-02-22 118 views
3

我想在地圖上使用map::find(key)找到一個元素,然後從我發現元素的位置開始(即直到map::rend())以相反的順序迭代映射。從給定的映射迭代器反向迭代

但是,當我嘗試將我的迭代器指定給reverse_iterator時,出現編譯錯誤。我該如何解決這個問題?

+0

在未來,一個小的代碼片段,並從編譯器確切的錯誤消息,可以極大地幫助解決大部分問題。 – 2010-02-22 12:36:55

回答

9

通過構造函數將迭代器轉換爲逆迭代器應該可以正常工作, std::map<K, V>::reverse_iterator rit(mypos)

使用std小例子::向量:

#include <vector> 
#include <iostream> 
#include <algorithm> 

int main() { 
    typedef std::vector<int> intVec; 
    intVec vec; 
    for(int i = 0; i < 20; ++i) vec.push_back(i); 

    for(intVec::reverse_iterator it(std::find(vec.begin(), vec.end(), 10)); 
     it != vec.rend(); it++) 
    std::cout << *it; 
} 
+0

thanx傢伙的快速反應。這樣做(即使我有時間試用其他)。 – OverTheEdge 2010-02-22 12:22:34

+0

+1。請注意,這個答案的關鍵部分是用'it(..)'替換'it = ..',這樣可以使用顯式的ctor。 – 2010-02-22 12:30:09

+0

感謝Rodger,它確實是reverse_iterator的構造函數之一,而不是複製構造函數。我的錯。 – pmr 2010-02-22 13:01:02

2

進行轉換明確:

std::map<int, int> SomeMap; 

for (int i = 0; i < 10; i++) 
    SomeMap[ i ] = i; 

std::map<int, int>::iterator it = SomeMap.find(5); 
std::map<int, int>::reverse_iterator itr(it); 

for (itr; itr != SomeMap.rend(); itr++) 
    std::cout << itr->first << std::endl;