2009-04-08 17 views
17

Je rencontre des problèmes pour effectuer une itération inverse sur une carte dans gcc C++. Quand j'utilise un itérateur inversé, il semble que je ne puisse rien y assigner - le compilateur se plaint. Je travaille avec un code maladroit avec un itérateur avant, mais ce n'est pas très élégant. Des pensées?comment itérer en sens inverse sur une carte en C++

+0

Ce que vous ne nous avez pas dit, c'est ce que vous voulez faire. – tpdi

+0

On dirait que vous utilisez peut-être un itérateur inversé, mais que vous appelez toujours le début et la fin plutôt que le rbegin et le rendu. La solution de GMan pourrait être ce que vous cherchez. Mais poster du code nous aidera à vous aider. – Smashery

+0

Merci - Je pensais avoir essayé le rbegin/déchiffer, mais j'ai dû m'emmêler d'une manière ou d'une autre. –

Répondre

36

Voici un exemple de itérer vers l'arrière par un std::map:

#include <iostream> 
#include <map> 
#include <string> 

int main() { 
    std::map<std::string, std::string> m; 
    m["a"] = "1"; 
    m["b"] = "2"; 
    m["c"] = "3"; 

    for (auto iter = m.rbegin(); iter != m.rend(); ++iter) { 
     std::cout << iter->first << ": " << iter->second << std::endl; 
    } 
} 

Si vous êtes pré-C++ 11, vous aurez juste besoin de préciser auto, qui est:

std::map<std::string, std::string>::reverse_iterator 

Notez que si vous utilisez boost, vous pouvez utiliser une boucle for-based avec un adaptateur inversé:

#include <boost/range/adaptor/reversed.hpp> 

for (auto& iter : boost::adaptors::reverse(m)) { 
    std::cout << iter.first << ": " << iter.second << std::endl; 
} 
+0

nom de type n'est pas nécessaire il –

+0

Oups, j'ai écrit beaucoup de choses sur le modèle dernièrement, je l'ai enlevé, merci. : X – GManNickG

+1

est-il possible d'utiliser 'auto' ici? – Chani

Questions connexes