C++で文字列を降順にソートする方法
C++プログラミングでは、sortメソッドなどさまざまな手法を使って、文字列を昇順・降順に並べ替えることができます。ここでは、文字列を比較するstrcmp関数(1つ目の単語と2つ目の単語を比較)と、文字列をコピーするstrcpy関数(1つ目の単語を一時変数に退避)を、外側と内側のループで組み合わせて、単語を降順に並べ替える方法を紹介します。
サンプルコード
#include<bits/stdc++.h>
using namespace std;
int main(){
char str[3][20]={"Ajay","Ramesh","Mahesh"};
char t[20];
int i, j;
for(i=1; i<3; i++){
for(j=1; j<3; j++){
if(strcmp(str[j-1], str[j])>0){
strcpy(t, str[j-1]);
strcpy(str[j-1], str[j]);
strcpy(str[j], t);
}
}
}
cout<<"Sorted in Descending Order ::"<<endl;
for(i=2; i>=0; i--){
cout<<str[i]<<"\n";
}
return 0;
}
コードの解説
このプログラムの処理の流れは以下のとおりです。
- strcmp関数:隣り合う2つの文字列を辞書順に比較します。戻り値が0より大きい場合、前の文字列の方が後の文字列より大きい(辞書順で後ろにある)ことを意味します。
- strcpy関数:文字列を別の配列にコピーします。ここでは、前の要素を一時変数
tに退避させてから、2つの要素を入れ替えています。 - 二重ループ:バブルソートと呼ばれる手法で、隣接する要素同士を繰り返し比較・交換することで、配列全体を整列させています。
ソート後、配列には「Ajay」「Mahesh」「Ramesh」の順(昇順)で文字列が格納されます。そのため、出力時はループを末尾から先頭へと逆方向に回すことで、降順の結果を表示しています。
出力結果
このプログラムは、3つの単語(Ajay、Ramesh、Mahesh)を入力として受け取り、それらを降順にソートした結果を出力します。
Sorted in Descending Order :: Ramesh Mahesh Ajay
std::sortを使ったモダンな方法
C++では、STLのstd::sortとstd::greaterを組み合わせることで、より簡潔に降順ソートを実現できます。
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<string> words = {"Ajay", "Ramesh", "Mahesh"};
sort(words.begin(), words.end(), greater<string>());
cout<<"Sorted in Descending Order ::"<<endl;
for(const auto& w : words){
cout<<w<<"\n";
}
return 0;
}
greater<string>()を比較関数として渡すことで、デフォルトで昇順にソートするstd::sortを降順ソートとして動作させることができます。可読性と安全性の面から、実務ではこちらの方法が推奨されます。
-
C++ STLのmap・multimapを降順で扱う方法
一般に、C++のmapおよびmultimapは、デフォルトではキーを昇順で格納します。しかし、第3テンプレート引数として比較用の関数オブジェクトstd::greaterを指定することで、要素を降順で格納することも簡単にできます。 mapを降順で使用する 使用する主なメンバ関数 m.find() – 指定したキーを持つ要素へのイテレータを返します。見つからない場合はend()イテレータを返します。 m.erase() – マップから指定したキーの要素を削除します。 m.equal_range() – イテレータのペア(pair)を返します。このペアは、指定したキーと等しいキーを持つすべての要素
-
C++で文字列をトークン化(分割)する2つの方法を解説
文字列のトークン化(分割)とは、1つの文字列を区切り文字(スペースやカンマなど)を基準に、複数の部分文字列へ分割する処理のことです。C++では、標準ライブラリだけでもいくつかの方法で実現できます。本記事では、代表的な2つの方法をサンプルコード付きで紹介します。方法1:stringstreamを使って空白で分割する1つ目の方法は、stringstreamを使ってスペースで区切られた単語を順に読み取る方法です。この方法はやや制限がありますが、適切なチェックを加えれば十分に目的を果たすことができます。サンプルコード#include <vector> #include <string