C++のstdライブラリでsort()を使用する
以下の文章を日本語でネイティブ的に言い換えてください。1つのオプションだけ必要です。
「Introduction」
やあ!今日はC++のstdライブラリのsort()関数について話し合います。
基本的には、ソーティングはアイテムをシステム的に並べ替えるプロセスです。これらのアイテムは、シーケンスの要素や任意のデータ構造の要素であることがあります。
C++には、標準ライブラリが予め定義されていて使いやすいsort()関数を提供しています。ですので、早速始めましょう。
C++におけるstd::sort()関数
C++のstd::sort()関数は、特定の順序で任意の形式のデータ構造を並べ替えるために使用される組み込み関数です。この関数は、algorithmヘッダファイルで定義されています。sort()関数のプロトタイプは以下のようになります。
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
ここでは、関数は何も返さずに、単に最初の要素から最後の要素または位置までの要素/アイテムを更新します。三番目のパラメータ(オプション)compは、要素の並び順を決定する関数でなければなりません。指定されていない場合、並べ替えはデフォルトでstd::less()関数を考慮して昇順に行われます。
sort()関数は、Introsortと呼ばれる3つの異なるソート手法を組み合わせたハイブリッドソート手法を使用しています。これは、クイックソート、ヒープソート、および挿入ソートが組み合わされたものです。
C++において、sort()関数を使用してデータを整理する。
今、sort()関数の基礎を学んだので、C++プログラムでいくつかのデータ構造(例えば配列)をソートするためにそれを使用しましょう。
1. 昇順での並べ替え
前述のように、compパラメータが指定されていない場合、sort()関数はデフォルトでアイテムのセットを昇順でソートします。
以下の例では、配列を昇順にソートするために最初(開始)と最後(終了)のイテラブルだけを渡しました。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
//array initialisation
int demo[5] = {5, 4, 3, 2, 1};
int len = sizeof(demo)/sizeof(demo[0]);
cout<<"Before sorting array : ";
for(int i=0; i<len; i++)
{
cout<<" "<<demo[i];
}
std::sort(demo, demo + len);//Sorting demo array
cout<<"\n\nAfter sorting array : ";
for(int i=0; i<len; i++)
{
cout<<" "<<demo[i];
}
return 0;
}
出力:
ここでは、demoは最初の要素のアドレスであり、(demo+len)は与えられた配列の最後の要素のアドレスです。したがって、デフォルトでstd::less()関数としてのcompを考慮すると、sort()関数は配列を昇順にソートします。
注意:std::less()関数は、2つの引数を比較し、最初の引数が2番目の引数よりも小さいかどうかに応じてTrueまたはFalseを返します。
2. 降順でのソート
sort()関数を使用して、データ構造を降順に並べ替えることもできます。そのためには、その三番目のパラメーターを操作します。さて、具体的に見てみましょう。
以下のコードでは、std::greater()関数を使用しています。この関数は、std::less()関数とはまったく逆の方法で動作します。この関数は、2つの引数を比較し、最初の引数がもう一方よりも大きい場合にTrueを返します。そうでなければFalseを返します。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
//array initialisation
int demo[5] = {44, 22, 55, 33, 66};
int len = sizeof(demo)/sizeof(demo[0]);
cout<<"Before sorting array : ";
for(int i=0; i<len; i++)
{
cout<<" "<<demo[i];
}
std::sort(demo, demo + len, greater<int>());//Sorting demo array
cout<<"\n\nAfter sorting array : ";
for(int i=0; i<len; i++)
{
cout<<" "<<demo[i];
}
return 0;
}
以下のように、sort()関数の3番目のパラメータとしてラムダ関数を使用することもできます。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
//array initialisation
int demo[5] = {44, 22, 55, 33, 66};
int len = sizeof(demo)/sizeof(demo[0]);
cout<<"Before sorting array : ";
for(int i=0; i<len; i++)
{
cout<<" "<<demo[i];
}
std::sort(demo, demo + len, [](int &e1, int &e2){ return e1>e2; });//Sorting demo array
cout<<"\n\nAfter sorting array : ";
for(int i=0; i<len; i++)
{
cout<<" "<<demo[i];
}
return 0;
}
上記の2つの例は、以下に示すものと同じ出力を生成します。そして、デモ配列を降順で正常にソートします。
以下の文章を日本語で表現してください(1つのオプションで十分です):「出力」
3. ユーザー定義の順序でのソート
std::sort()関数の第3引数(comp)は、ソートの順序を定義するユーザー定義の関数にすることもできます。
この機能は、真偽値(True / False)を返す必要があることに注意するべきです。
以下のコードスニペットでは、配列要素を10で割った余りに基づいてソートしようとしました(「%」演算子を使用して)。
#include<iostream>
#include<algorithm>
using namespace std;
//our function
bool My_func( int a, int b)
{
return (a%10)<(b%10);
}
int main()
{
//array initialisation
int demo[5] = {18, 45, 34, 92, 21};
int len = sizeof(demo)/sizeof(demo[0]);
cout<<"Before sorting array : ";
for(int i=0; i<len; i++)
{
cout<<" "<<demo[i];
}
std::sort(demo, demo + len, My_func);//Sorting demo array
cout<<"\n\nAfter sorting array : ";
for(int i=0; i<len; i++)
{
cout<<" "<<demo[i];
}
return 0;
}
出力:
上記の結果からわかる通り、デモ配列は(element%10)の要素を基準に正常にソートされました。弊社のMy_func()関数の助けを借りて。
C++におけるstd::sort()の複雑さ
ソート関数は、N個のアイテムをソートするためにNlog(N)回の比較を行います。したがって、最悪の場合の計算量はO(Nlog(N))です。
まとめる
それで今回は以上です。今日はC++標準ライブラリ内のsort()関数の使い方と動作を理解しました。皆さんが明確に理解できたことを願っています。
このチュートリアルでは、より理解しやすくするために、配列を考慮していますが、sort()関数は配列以外のデータ構造(ベクターなど)にも使用できることに注意してください。
私たちは、私たちのC++チュートリアルを参考にすることをおすすめします。
さらなる質問があれば、以下のコメント欄をご自由にご利用ください。
参考文献
- std::sort() – C++ Documentation,
- Standard Template Library (STL) in C++,
- – C++ algorithm Library.