C++ で値でマップを並べ替える
- 
          
            C++ でマップの要素を値でソートするには std::vectorとstd::sortのアルゴリズムを使用する
- 
          
            C++ でマップ要素を値でソートするには std::mapとstd::map::emplaceを使用する
 
この記事では、C++ で値によってマップを並べ替える方法に関する複数の方法を示します。
C++ でマップの要素を値でソートするには std::vector と std::sort のアルゴリズムを使用する
    
std::map は、一意のキーを持つキーと値のペアを格納できる連想コンテナであり、後者はオブジェクト内の要素を自動的に並べ替えるために使用されます。この場合、キーとして整数文字列を使用し、値として通常の文字列を使用して、サンプルの std::map オブジェクトを宣言しています。問題は、これらの要素を文字列の値で並べ替えることです。
std::map 構造で std::sort アルゴリズムを直接使用することはできないため、ソート可能な別のオブジェクトを初期化する必要があります。したがって、std::vector の宣言には、同じタイプのペアが含まれています。for ループと emplace_back メソッドを使用して vector 要素を作成します。ループが実行されると、vector を std::sort アルゴリズムに渡す準備が整います。要素比較関数を定義するためにラムダ式を指定し、2 番目のメンバーのみを比較することに注意してください。最後に、std::vector 要素をソートされたマップ表現として出力できます。
#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;
}
出力:
Sorted -
5 : Beetroot
3 : Ginger
4 : Melon
2 : Pumpkin
6 : Spinach
1 : Yam
C++ でマップ要素を値でソートするには std::map と std::map::emplace を使用する
以前のソリューションは、std::map オブジェクト自体を処理せず、並べ替えに外部構造を使用していました。この場合、値でソートされた要素を別の std::map オブジェクトに格納するソリューションを実装します。これは、組み込みのマップ関数である emplace を使用して実現できます。つまり、別の map オブジェクトを宣言し、emplace メソッドを使用してその要素を構築しますが、逆のキーと値のペアも渡します。その結果、map コンテナは要素をキー(前の map オブジェクトの値)で自動的に並べ替えます。次に、ソートされた map オブジェクトを、別のオブジェクトに格納されることを心配せずに、次のコードブロックで必要になる可能性のある他の操作に使用できます。
#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;
}
出力:
Sorted -
5 : Beetroot
3 : Ginger
4 : Melon
2 : Pumpkin
6 : Spinach
1 : Yam
