[C++] vectorで文字列をソートする方法
C++でvector
に格納された文字列をソートするには、標準ライブラリのstd::sort関数
を使用します。
まず、#include <vector>
と#include <algorithm>
をインクルードします。
次に、ソートしたいvector
を用意し、std::sort関数
を呼び出します。
std::sort
は、vector
の開始イテレータと終了イテレータを引数に取ります。
デフォルトでは、文字列は辞書順にソートされます。
カスタムの比較関数を指定することで、異なる順序でソートすることも可能です。
ソートの基本
ソートアルゴリズムの概要
ソートアルゴリズムは、データを特定の順序に並べ替えるための手法です。
一般的なソートの目的は、データを昇順または降順に整列させることです。
ソートアルゴリズムには、バブルソート、クイックソート、マージソートなど、さまざまな種類があります。
それぞれのアルゴリズムは、データの特性やサイズに応じて異なる効率性を持ちます。
C++では、標準ライブラリを利用することで、これらのソートを簡単に実装することができます。
C++でのソートの方法
C++では、標準ライブラリに含まれるstd::sort関数
を使用して、簡単にデータをソートすることができます。
この関数は、内部で効率的なアルゴリズムを使用しており、一般的にはクイックソートやヒープソートが用いられます。
std::sort
は、指定した範囲の要素を並べ替えることができ、デフォルトでは昇順にソートされます。
std::sort関数の使い方
std::sort関数
は、C++の<algorithm>ヘッダーに含まれており、以下のように使用します。
#include <iostream>
#include <vector>
#include <algorithm> // std::sortを使用するために必要
int main() {
std::vector<std::string> words = {"りんご", "みかん", "バナナ", "ぶどう"};
// 文字列のベクトルを作成
std::sort(words.begin(), words.end());
// std::sortを使用してベクトルを昇順にソート
for (const auto& word : words) {
std::cout << word << " ";
// ソートされた結果を出力
}
return 0;
}
ぶどう みかん りんご バナナ
この例では、std::sort
を使用して、文字列のベクトルを昇順にソートしています。
std::sort
は、ベクトルの開始位置と終了位置を引数として受け取り、その範囲内の要素を並べ替えます。
ソート後、for
ループを使って結果を出力しています。
vectorで文字列をソートする手順
std::sortを使った基本的なソート
C++のstd::sort関数
を使用することで、vector
内の文字列を簡単にソートすることができます。
std::sort
は、デフォルトで昇順にソートを行います。
以下の例では、文字列のvector
を昇順にソートしています。
#include <iostream>
#include <vector>
#include <algorithm> // std::sortを使用するために必要
int main() {
std::vector<std::string> fruits = {"りんご", "みかん", "バナナ", "ぶどう"};
// 文字列のベクトルを作成
std::sort(fruits.begin(), fruits.end());
// std::sortを使用してベクトルを昇順にソート
for (const auto& fruit : fruits) {
std::cout << fruit << " ";
// ソートされた結果を出力
}
return 0;
}
ぶどう みかん りんご バナナ
このコードでは、std::sort
を使用して、fruits
ベクトルを昇順にソートしています。
辞書順でのソート
std::sort
を使用すると、デフォルトで辞書順にソートされます。
辞書順とは、アルファベット順や五十音順のように、文字列を文字コードに基づいて並べ替える方法です。
以下の例では、辞書順でソートされた結果を示しています。
#include <iostream>
#include <vector>
#include <algorithm> // std::sortを使用するために必要
int main() {
std::vector<std::string> animals = {"ねこ", "いぬ", "うさぎ", "とり"};
// 文字列のベクトルを作成
std::sort(animals.begin(), animals.end());
// std::sortを使用してベクトルを辞書順にソート
for (const auto& animal : animals) {
std::cout << animal << " ";
// ソートされた結果を出力
}
return 0;
}
いぬ うさぎ ねこ とり
この例では、animals
ベクトルが辞書順にソートされています。
大文字と小文字を区別しないソート
大文字と小文字を区別せずにソートするには、カスタムの比較関数を使用します。
以下の例では、std::transform
を使ってすべての文字を小文字に変換し、比較を行っています。
#include <iostream>
#include <vector>
#include <algorithm> // std::sortを使用するために必要
#include <cctype> // std::tolowerを使用するために必要
bool caseInsensitiveCompare(const std::string& a, const std::string& b) {
std::string lowerA = a;
std::string lowerB = b;
std::transform(lowerA.begin(), lowerA.end(), lowerA.begin(), ::tolower);
// 文字列aを小文字に変換
std::transform(lowerB.begin(), lowerB.end(), lowerB.begin(), ::tolower);
// 文字列bを小文字に変換
return lowerA < lowerB;
// 小文字に変換した文字列を比較
}
int main() {
std::vector<std::string> words = {"Apple", "banana", "Cherry", "apricot"};
// 文字列のベクトルを作成
std::sort(words.begin(), words.end(), caseInsensitiveCompare);
// 大文字小文字を区別しないソートを実行
for (const auto& word : words) {
std::cout << word << " ";
// ソートされた結果を出力
}
return 0;
}
Apple apricot banana Cherry
このコードでは、caseInsensitiveCompare関数
を使用して、大文字と小文字を区別せずにソートを行っています。
std::transform
を用いて、各文字列を小文字に変換し、その結果を比較しています。
カスタムソートの実装
カスタム比較関数の作成
カスタムソートを行うためには、独自の比較関数を作成する必要があります。
比較関数は、2つの要素を引数に取り、最初の要素が2番目の要素よりも小さい場合にtrue
を返すように実装します。
以下は、文字列の長さに基づいてソートするためのカスタム比較関数の例です。
#include <string>
// 文字列の長さで比較する関数
bool compareByLength(const std::string& a, const std::string& b) {
return a.length() < b.length();
// 文字列aの長さが文字列bの長さより小さいかを返す
}
この関数は、文字列の長さを基準にして、短い文字列が前に来るようにソートします。
比較関数をstd::sortに適用する方法
作成したカスタム比較関数をstd::sort
に適用することで、独自の基準でソートを行うことができます。
以下の例では、先ほど作成したcompareByLength関数
を使用して、文字列の長さでソートしています。
#include <algorithm> // std::sortを使用するために必要
#include <iostream>
#include <string>
#include <vector>
// 文字列の長さで比較する関数
bool compareByLength(const std::string& a, const std::string& b) {
return a.length() < b.length();
// 文字列aの長さが文字列bの長さより小さいかを返す
}
int main() {
std::vector<std::string> fruits = {"Hello", "Goodbye", "OK", "Okay"};
// 文字列のベクトルを作成
std::sort(fruits.begin(), fruits.end(), compareByLength);
// カスタム比較関数を使用してベクトルをソート
for (const auto& fruit : fruits) {
std::cout << fruit << " ";
// ソートされた結果を出力
}
return 0;
}
OK Okay Hello Goodbye
このコードでは、compareByLength関数
をstd::sort
に渡すことで、文字列の長さに基づいてソートを行っています。
ソート順を逆にする方法
ソート順を逆にするには、std::sort
に渡す比較関数を変更するか、std::greater
を使用することができます。
以下の例では、文字列の長さで逆順にソートするための比較関数を作成しています。
#include <algorithm> // std::sortを使用するために必要
#include <iostream>
#include <string>
#include <vector>
// 文字列の長さで逆順に比較する関数
bool compareByLengthDescending(const std::string& a, const std::string& b) {
return a.length() > b.length();
// 文字列aの長さが文字列bの長さより大きいかを返す
}
int main() {
std::vector<std::string> fruits = {"Hello", "Goodbye", "OK", "Okay"};
// 文字列のベクトルを作成
std::sort(fruits.begin(), fruits.end(), compareByLengthDescending);
// カスタム比較関数を使用してベクトルをソート
for (const auto& fruit : fruits) {
std::cout << fruit << " ";
// ソートされた結果を出力
}
return 0;
}
Goodbye Hello Okay OK
このコードでは、compareByLengthDescending関数
を使用して、文字列の長さで逆順にソートしています。
比較関数を変更することで、ソートの順序を簡単に逆にすることができます。
応用例
複数の条件でソートする
複数の条件でソートを行う場合、カスタム比較関数を工夫することで実現できます。
例えば、文字列の長さでソートし、同じ長さの場合は辞書順でソートする例を示します。
#include <algorithm> // std::sortを使用するために必要
#include <iostream>
#include <vector>
// 複数の条件で比較する関数
bool compareByLengthAndAlphabet(const std::string& a, const std::string& b) {
if (a.length() == b.length()) {
return a < b;
// 長さが同じ場合は辞書順で比較
}
return a.length() < b.length();
// 長さで比較
}
int main() {
std::vector<std::string> words = {"もも", "みかん", "さくらんぼ", "ぶどう",
"ますかっと"};
// 文字列のベクトルを作成
std::sort(words.begin(), words.end(), compareByLengthAndAlphabet);
// 複数の条件でソート
for (const auto& word : words) {
std::cout << word << " ";
// ソートされた結果を出力
}
return 0;
}
もも ぶどう みかん さくらんぼ ますかっと
このコードでは、文字列の長さでソートし、同じ長さの場合は辞書順でソートしています。
ソート結果を別のvectorに保存する
ソート結果を別のvector
に保存するには、元のvector
をコピーしてからソートを行います。
以下の例では、元のvector
を保持しつつ、ソートされた結果を新しいvector
に保存しています。
#include <iostream>
#include <vector>
#include <algorithm> // std::sortを使用するために必要
int main() {
std::vector<std::string> original = {"りんご", "みかん", "バナナ", "ぶどう"};
// 元のベクトルを作成
std::vector<std::string> sorted = original;
// 元のベクトルをコピーして新しいベクトルを作成
std::sort(sorted.begin(), sorted.end());
// コピーしたベクトルをソート
std::cout << "元のベクトル: ";
for (const auto& word : original) {
std::cout << word << " ";
// 元のベクトルを出力
}
std::cout << "\nソートされたベクトル: ";
for (const auto& word : sorted) {
std::cout << word << " ";
// ソートされたベクトルを出力
}
return 0;
}
元のベクトル: りんご みかん バナナ ぶどう
ソートされたベクトル: ぶどう みかん りんご バナナ
このコードでは、元のvector
をコピーしてソートし、ソート結果を別のvector
に保存しています。
ソート後に重複を削除する
ソート後に重複を削除するには、std::unique
とerase
を組み合わせて使用します。
以下の例では、ソートされたvector
から重複を削除しています。
#include <iostream>
#include <vector>
#include <algorithm> // std::sortとstd::uniqueを使用するために必要
int main() {
std::vector<std::string> words = {"りんご", "みかん", "バナナ", "ぶどう", "りんご", "バナナ"};
// 重複を含むベクトルを作成
std::sort(words.begin(), words.end());
// ベクトルをソート
auto last = std::unique(words.begin(), words.end());
// 重複を削除し、重複のない範囲の終端を取得
words.erase(last, words.end());
// 重複を削除した範囲以降を削除
for (const auto& word : words) {
std::cout << word << " ";
// 重複を削除した結果を出力
}
return 0;
}
ぶどう みかん りんご バナナ
このコードでは、std::unique
を使用して重複を削除し、erase
で不要な要素を削除しています。
ソートを行うことで、重複した要素が隣接するため、std::unique
が正しく機能します。
まとめ
この記事では、C++におけるvector
を用いた文字列のソート方法について、基本的なstd::sort
の使い方からカスタムソートの実装、応用例までを詳しく解説しました。
これにより、読者はvector
内の文字列を効率的にソートするための具体的な手法を身につけることができたでしょう。
これを機に、実際のプログラムでこれらのテクニックを活用し、より複雑なデータ処理に挑戦してみてください。