Ordina map per valore in C++

Jinku Hu 12 ottobre 2023
  1. Usa l’algoritmo std::vector e std::sort per ordinare gli elementi della mappa in base al valore in C++
  2. Usa std::map e std::map::emplace per ordinare gli elementi della mappa per valore in C++
Ordina map per valore in C++

Questo articolo illustrerà più metodi su come ordinare la mappa in base ai valori in C++.

Usa l’algoritmo std::vector e std::sort per ordinare gli elementi della mappa in base al valore in C++

std::map è un contenitore associativo che può memorizzare coppie chiave-valore con chiavi univoche, e queste ultime sono usate per ordinare automaticamente gli elementi nell’oggetto. In questo caso, stiamo dichiarando un oggetto std::map di esempio con stringhe intere come chiavi e stringhe regolari come valori. Il problema è ordinare questi elementi in base ai valori delle stringhe.

Non possiamo usare direttamente l’algoritmo std::sort sulla struttura std::map, quindi dobbiamo inizializzare un altro oggetto che può essere ordinato. Pertanto, la dichiarazione dello std::vector contiene le coppie dello stesso tipo. Costruiamo elementi vettore usando il cicli for e il metodo emplace_back. Una volta che il bucle è stato eseguito, il vector è pronto per essere passato all’algoritmo std::sort. Si noti che specifichiamo l’espressione lambda per definire la funzione di confronto degli elementi e confronta solo i secondi membri. Infine, possiamo produrre gli elementi std::vector come una rappresentazione di mappa ordinata.

#include <iostream>
#include <map>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;
using std::vector;

int main() {
  map<string, string> veggy_map = {{
                                       "1",
                                       "Yam",
                                   },
                                   {
                                       "2",
                                       "Pumpkin",
                                   },
                                   {
                                       "3",
                                       "Ginger",
                                   },
                                   {
                                       "4",
                                       "Melon",
                                   },
                                   {
                                       "5",
                                       "Beetroot",
                                   },
                                   {
                                       "6",
                                       "Spinach",
                                   }};

  cout << "Unsorted - " << endl;
  for (const auto &[key, value] : veggy_map) {
    cout << key << " : " << value << endl;
  }

  vector<std::pair<string, string> > arr;
  for (const auto &item : veggy_map) {
    arr.emplace_back(item);
  }

  std::sort(arr.begin(), arr.end(),
            [](const auto &x, const auto &y) { return x.second < y.second; });

  cout << "Sorted - " << endl;
  for (const auto &[key, value] : arr) {
    cout << key << " : " << value << endl;
  }

  return EXIT_SUCCESS;
}

Produzione:

Sorted -
5 : Beetroot
3 : Ginger
4 : Melon
2 : Pumpkin
6 : Spinach
1 : Yam

Usa std::map e std::map::emplace per ordinare gli elementi della mappa per valore in C++

La soluzione precedente non si occupava dello stesso oggetto std::map e utilizzava una struttura esterna per l’ordinamento. In questo caso, implementiamo una soluzione per memorizzare gli elementi ordinati per valore in un altro oggetto std::map. Ciò può essere ottenuto utilizzando la funzione mappa incorporata - emplace. Vale a dire, dichiariamo un altro oggetto map e costruiamo i suoi elementi usando il metodo emplace, ma passiamo anche le coppie chiave-valore invertite. Di conseguenza, il contenitore map ordina automaticamente gli elementi in base alle chiavi: i valori nell’oggetto map precedente. Successivamente, possiamo usare l’oggetto map ordinato per altre operazioni che potrebbero essere necessarie nei seguenti blocchi di codice senza preoccuparci che sia memorizzato in un oggetto diverso.

#include <iostream>
#include <map>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;
using std::vector;

int main() {
  map<string, string> veggy_map = {{
                                       "1",
                                       "Yam",
                                   },
                                   {
                                       "2",
                                       "Pumpkin",
                                   },
                                   {
                                       "3",
                                       "Ginger",
                                   },
                                   {
                                       "4",
                                       "Melon",
                                   },
                                   {
                                       "5",
                                       "Beetroot",
                                   },
                                   {
                                       "6",
                                       "Spinach",
                                   }};

  cout << "Unsorted - " << endl;
  for (const auto& [key, value] : veggy_map) {
    cout << key << " : " << value << endl;
  }

  cout << "Sorted - " << endl;

  map<string, string> veggy_map2;

  for (const auto& [key, value] : veggy_map) {
    veggy_map2.emplace(value, key);
  }

  for (const auto& [key, value] : veggy_map2) {
    cout << value << " : " << key << endl;
  }

  return EXIT_SUCCESS;
}

Produzione:

Sorted -
5 : Beetroot
3 : Ginger
4 : Melon
2 : Pumpkin
6 : Spinach
1 : Yam
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Articolo correlato - C++ Map