web-dev-qa-db-fra.com

C ++ std :: mappe les éléments dans l'ordre décroissant des clés

Comment j'utilise le conteneur std :: map avec la valeur de clé dans l'ordre décroissant.

Par exemple, si insérez les éléments suivants:

[2 , 5]
[1 , 34]
[3 , 67]

Ils seront classés dans la carte comme:

position 0: [1, 34]
position 1: [2, 5]
position 2: [3, 67]

Je peux parcourir la carte à l'envers, mais supposons que la prochaine fois que j'insérerai [-1, 60]. Sera-t-il placé en première position?

23
Sigcont

Utilisez un comparateur personnalisé lorsque la commande par défaut ne le fait pas pour vous.
Vous le transmettez comme troisième paramètre de modèle (qui est normalement défini par défaut sur std::less<KeyType>).
Dans votre cas, vous pouvez utiliser std::greater:

std::map<int, int, std::greater<int> > m;

Exemple de code:

#include <map>
#include <iostream>
#include <functional>

int main() {
  std::map<int, int, std::greater<int>> m { {-1, 77}, {0, 42}, {1, 84} };
  for (const auto& p : m)
    std::cout << '[' << p.first << ',' << p.second << "]\n";
}

Sortie résultante:

[1,84]
[0,77]
[-1,42]
44
jrok

std::map est déjà trié, vous n'avez donc qu'à parcourir la carte à l'aide d'un reverse_iterator.

Une carte, cependant, n'est pas un tableau. Il n'y a rien de tel que "la nième position" sur une carte. (std::map est le plus souvent implémenté en utilisant une sorte d'arbre de recherche binaire.) Si vous absolument, inévitablement devez spécifier l'ordre manuellement, alors utilisez un std::vector<std::pair>.

0
user3447428