C++ でペアのベクトルを並べ替える
-
C++ の最初の要素値で
std::sort
アルゴリズムを使用してペアのベクトルを並べ替える -
C++ の 2 番目の要素値でラムダ式を使用した
std::sort
アルゴリズムを使用してペアのベクトルを並べ替える -
C++ でカスタム関数で
std::sort
アルゴリズムを使用してペアのベクトルを並べ替える
この記事では、C++ でペアのベクトルを並べ替える方法について説明します。
C++ の最初の要素値で std::sort
アルゴリズムを使用してペアのベクトルを並べ替える
ペアは、C++ 標準テンプレートライブラリで個別のクラスとして提供されます。2つの異種オブジェクトを 1つのユニットとして格納するためのタイプを実装します。std::pair
アルゴリズムは、基本的に 2つの要素のみを持つタプルのようなデータ構造です。
ペアオブジェクトは、各要素のタイプを指定する 2つのテンプレートパラメータで宣言されます。ペア宣言をベクトルテンプレートパラメータとして配置することにより、pair
オブジェクトのベクトルを宣言できます。次のコードスニペットに示すように、ペアのベクトルは、各ペアを個別の中括弧で渡すことにより、イニシャライザリストで初期化できます。
STL が提供する一般的な並べ替えアルゴリズムを使用して、ペアのベクトルを並べ替えることができます。std::sort
関数は、ソートされる範囲の 2つのイテレータを取り、デフォルトで要素を降順ではない順序で再配置します。ペアの場合、ベクトルは各ペアの最初の要素でソートされます。
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::pair;
using std::string;
using std::vector;
template <typename T>
void printVector(vector<T> &vec) {
for (const auto &item : vec) {
cout << "{" << item.first << "," << item.second << "}"
<< "; ";
}
cout << endl;
}
int main() {
vector<pair<int, string>> vec1 = {
{12, "eleven"}, {32, "thirty-two"}, {6, "six"}, {43, "forty-three"}};
cout << "vec1: ";
printVector(vec1);
std::sort(vec1.begin(), vec1.end());
cout << "vec1: ";
printVector(vec1);
return EXIT_SUCCESS;
}
出力:
vec1: {12,eleven}; {32,thirty-two}; {6,six}; {43,forty-three};
vec1: {6,six}; {12,eleven}; {32,thirty-two}; {43,forty-three};
C++ の 2 番目の要素値でラムダ式を使用した std::sort
アルゴリズムを使用してペアのベクトルを並べ替える
または、オプションの比較関数オブジェクトを std::sort
アルゴリズムに渡すと、指定されたペアのベクトルを 2 番目の要素値で並べ替えることができます。この場合、ラムダ式を使用して関数オブジェクトを形成し、それを sort
関数呼び出しの 3 番目の引数として渡します。これは基本的に、ペアの要素のカスタム比較ルーチンを定義する方法であることに注意してください。
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::pair;
using std::string;
using std::vector;
template <typename T>
void printVector(vector<T> &vec) {
for (const auto &item : vec) {
cout << "{" << item.first << "," << item.second << "}"
<< "; ";
}
cout << endl;
}
int main() {
vector<pair<int, string>> vec1 = {
{12, "eleven"}, {32, "thirty-two"}, {6, "six"}, {43, "forty-three"}};
cout << "vec1: ";
printVector(vec1);
std::sort(vec1.begin(), vec1.end(),
[](const auto &x, const auto &y) { return x.second < y.second; });
cout << "vec1: ";
printVector(vec1);
cout << endl;
return EXIT_SUCCESS;
}
出力:
vec1: {12,eleven}; {32,thirty-two}; {6,six}; {43,forty-three};
vec1: {12,eleven}; {43,forty-three}; {6,six}; {32,thirty-two};
C++ でカスタム関数で std::sort
アルゴリズムを使用してペアのベクトルを並べ替える
比較関数を std::sort
アルゴリズムに渡す別の方法は、bool cmp(const Type1 &a, const Type2 &b)
の形式で別の関数を定義することです。一般に、std::sort
には O(nlogn)
の実行時間の複雑さがあります。
次の例では、各ペアの最初の要素を比較する sortPairs
関数を定義します。ただし、カスタムクラスオブジェクトを格納するペアに対して、または複数のデータメンバーを評価する必要がある場合は、より複雑な比較関数を定義できます。
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::pair;
using std::string;
using std::vector;
template <typename T>
void printVector(vector<T> &vec) {
for (const auto &item : vec) {
cout << "{" << item.first << "," << item.second << "}"
<< "; ";
}
cout << endl;
}
bool sortPairs(const pair<int, string> &x, const pair<int, string> &y) {
return x.first > y.first;
}
int main() {
vector<pair<int, string>> vec1 = {
{12, "eleven"}, {32, "thirty-two"}, {6, "six"}, {43, "forty-three"}};
cout << "vec1: ";
printVector(vec1);
std::sort(vec1.begin(), vec1.end(), sortPairs);
cout << "vec1: ";
printVector(vec1);
cout << endl;
return EXIT_SUCCESS;
}
出力:
vec1: {12,eleven}; {32,thirty-two}; {6,six}; {43,forty-three};
vec1: {43,forty-three}; {32,thirty-two}; {12,eleven}; {6,six};