2010-02-22 5 views
3

Je souhaite trouver un élément dans la carte en utilisant map::find(key), puis parcourir la carte dans l'ordre inverse depuis le point où j'ai trouvé l'élément, jusqu'au début (c'est-à-dire jusqu'à map::rend()).Itération inversée d'une carte donnée itérateur

Cependant, j'obtiens une erreur de compilation lorsque j'essaie d'assigner mon itérateur à un reverse_iterator. Comment puis-je résoudre ceci?

+0

À l'avenir, un petit extrait de code et le message d'erreur exact du compilateur peut grandement aider résoudre la plupart des questions. –

Répondre

9

La conversion d'un itérateur en un itérateur inverse via le constructeur devrait fonctionner correctement, par ex. std::map<K, V>::reverse_iterator rit(mypos).

Un exemple minimal en utilisant std :: vecteur:

#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

merci les gars pour la réponse rapide. Cela l'a fait (bien que je doive avoir le temps d'essayer les autres.) – OverTheEdge

+0

+1. Notez que la partie clé de cette réponse remplace 'it = ..' par' it (..) ', de sorte que le ctor explicite puisse être utilisé. –

+0

Merci Rodger, c'est en effet l'un des constructeurs de reverse_iterator et de _not_ le constructeur de la copie. Ma faute. – pmr

2

Faire la conversion explicite:

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;