27 votes

Décrément de fin de std :: map

Voici mon code:

 #include <iostream>
#include <map>
using namespace std;

int main() {
    map<int , int > myMap;

    map<int , int>::iterator it;

    myMap.insert(pair<int , int>(1,2));
    myMap.insert(pair<int , int>(671,223));
    myMap.insert(pair<int , int>(353,245352));

    it = myMap.end() - 1;

    cout << it->first << it->second << endl;

    return 0;
}
 

La compilation de ce code produit l'erreur de compilation suivante:

 error: no match for ‘operator-' (operand types are ‘std::map<int, int>::iterator {aka std::_Rb_tree_iterator<std::pair<const int, int> >}' and ‘int')
  it = myMap.end() - 1;
 

Je ne sais pas pourquoi j'obtiens cette erreur car je pense que les opérations arithmétiques sont autorisées dans tous les types d'itérateurs.

41voto

StoryTeller Points 6139

Pas tous les itérateur catégories de soutien des opérations arithmétiques, c'est une idée fausse. Si vous visez à écrire plus de code générique, vous pouvez utiliser std::prev:

it = std::prev(myMap.end());

Il s'attend à un itérateur bidirectionnel, qui std::maps'itérateur est. Si vous souhaitez déplacer l'itérateur plus qu'une seule étape, il peut également accepter un deuxième paramètre qui désignés de la façon dont la mesure de déplacer l'itérateur.

En outre, lorsque vous passez un itérateur à accès aléatoire, il sera aussi rapide que la moyenne.

17voto

Joachim Pileborg Points 121221

Je vous recommande de lire sur les différents itérateur catégories, et d'apprendre ce que les opérations sont disponibles sur eux.

Plus spécifiquement, l' std::map itérateur est un itérateur bidirectionnel qui n'a pas de soustraction binaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X