C++ で文字列を並べ替える
胡金庫
2023年10月12日
このガイドでは、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;
著者: 胡金庫