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