C++ で文字列を並べ替える

胡金庫 2023年10月12日
  1. C++ で std::sort アルゴリズムを使用して文字列を並べ替える
  2. C++ でカスタム関数ラッパーを使用して文字列を並べ替える
C++ で文字列を並べ替える

このガイドでは、C++ で文字列を並べ替える方法のいくつかの方法について説明します。

C++ で std::sort アルゴリズムを使用して文字列を並べ替える

この記事では、文字のシーケンスが std::string オブジェクトに格納されていることを前提としています。std::string クラスオブジェクトは反復可能であるため、範囲ベースの STL 関数を呼び出すことができます。この場合、各文字列で STL アルゴリズムの std::sort 関数を使用します。ここでは、std::sort 関数の最も単純なオーバーロードを利用します。この関数は、2つのイテレーター引数を使用して範囲をトラバースし、デフォルトで要素を降順ではない順序で並べ替えます。

#include <algorithm>
#include <iostream>
#include <vector>

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

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << item << "; " << endl;
  }
  cout << endl;
}

int main() {
  vector<string> vec1 = {"algorithms library", "occurrences",
                         "implementation-specific", "contribute",
                         "specialization"};

  for (auto &item : vec1) {
    sort(item.begin(), item.end());
  }
  printVector(vec1);

  return EXIT_SUCCESS;
}

出力:

aabghiillmorrrsty;
ccceenorrsu;
-acceeefiiiilmmnnoppstt;
bceinorttu;
aaceiiilnopstz;

または、カスタムコンパレータ関数を std::sort アルゴリズムに渡して、それに応じて要素を並べ替えることもできます。関数プロトタイプは次の形式である必要があることに注意してください:bool cmp(const Type1 &a, const Type2 &b);。次のサンプルコードでは、ラムダ式を使用して、並べ替え順序を降順に反転しています。

#include <algorithm>
#include <iostream>
#include <vector>

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

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << item << "; " << endl;
  }
  cout << endl;
}

int main() {
  vector<string> vec1 = {"algorithms library", "occurrences",
                         "implementation-specific", "contribute",
                         "specialization"};

  for (auto &item : vec1) {
    sort(item.begin(), item.end(), [](auto &c1, auto &c2) { return c1 > c2; });
  }
  printVector(vec1);

  return EXIT_SUCCESS;
}

出力:

ytsrrromlliihgbaa ;
usrroneeccc;
ttspponnmmliiiifeeecca-;
uttroniecb;
ztsponliiiecaa;

C++ でカスタム関数ラッパーを使用して文字列を並べ替える

前のソリューションの顕著な欠陥の 1つは、文字の句読点と間隔を有効な英数字と区別できないことです。したがって、指定された string オブジェクトからすべての句読点とスペース文字を破棄し、std::sort アルゴリズムを呼び出してソート操作を実行する別の関数を実装できます。削除操作は、ラムダ式を使用して各文字のタイプをチェックする erase-remove_if イディオムを使用して実行されます。isspace および ispunct 関数は、<locale> ヘッダーファイルからインクルードされて使用されます。

#include <algorithm>
#include <iostream>
#include <locale>
#include <vector>

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

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << item << "; " << endl;
  }
  cout << endl;
}

void sortStringChars(string &s) {
  s.erase(std::remove_if(
              s.begin(), s.end(),
              [](auto &c) { return std::isspace(c) || std::ispunct(c); }),
          s.end());
  sort(s.begin(), s.end());
}

int main() {
  vector<string> vec1 = {"algorithms library", "occurrences",
                         "implementation-specific", "contribute",
                         "specialization"};

  for (auto &item : vec1) {
    sortStringChars(item);
  }
  printVector(vec1);

  return EXIT_SUCCESS;
}

出力:

aabghiillmorrrsty;
ccceenorrsu;
acceeefiiiilmmnnoppstt;
bceinorttu;
aaceiiilnopstz;
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

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

LinkedIn Facebook

関連記事 - C++ String