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;
}

出力:

Sort1

ここでは、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つのオプションで十分です):「出力」

Sort2

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;
}

出力:

Sort3

上記の結果からわかる通り、デモ配列は(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.
コメントを残す 0

Your email address will not be published. Required fields are marked *