Décrémentation de la 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 je reçois cette erreur car je pense que les opérations arithmétiques sont autorisées dans tous les types d'itérateurs.
2 réponses
Toutes les catégories d'itérateurs ne supportent pas les 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 attend un itérateur bidirectionnel, qui est l'itérateur de std::map
. Si vous souhaitez déplacer l'itérateur plus d'une étape, il peut également accepter un deuxième paramètre qui indique à quelle distance déplacer l'itérateur.
De plus, lorsque vous lui transmettez un itérateur à accès aléatoire, il sera aussi rapide que l'arithmétique.
Je vous recommande de lire sur les différents catégories d'itérateurs, et apprenez quelles opérations sont disponibles sur eux.
Plus précisément le std::map
itérateur est un itérateur bidirectionnel, qui n'a pas de soustraction binaire.