C++ でペアのベクトルを並べ替える

胡金庫 2023年10月12日
  1. C++ の最初の要素値で std::sort アルゴリズムを使用してペアのベクトルを並べ替える
  2. C++ の 2 番目の要素値でラムダ式を使用した std::sort アルゴリズムを使用してペアのベクトルを並べ替える
  3. C++ でカスタム関数で std::sort アルゴリズムを使用してペアのベクトルを並べ替える
C++ でペアのベクトルを並べ替える

この記事では、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};
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Vector