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.

27
demandé sur Jean-François Corbett 2017-10-09 09:40:44

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.

41
répondu StoryTeller 2017-10-09 06:48:56

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.

17
répondu Some programmer dude 2017-10-09 06:44:51