[C++] STL アルゴリズム ⑨ (定義済み関数オブジェクトの例 - コンテナ要素を大きい順に並べ替える | 並べ替えアルゴリズム | 大きい<T> 定義済み関数オブジェクト)





1. 定義済み関数オブジェクトの例 - コンテナ要素を大きいものから小さいものへ並べ替える



1.ソートソートアルゴリズム


C++ 標準テンプレート ライブラリ (STL、標準テンプレート ライブラリ) は、<algorithm> ヘッダー ファイルで定義され、汎用アルゴリズムである並べ替えアルゴリズム関数を提供します。

ソート アルゴリズムは、コンテナ内の要素をソートするために使用されます。このアルゴリズムは非常に効率的で、指定された反復子の範囲内で要素をソートでき、ソート順序はユーザー指定の比較関数に基づいて定義できます。

ユーザー指定の比較関数はバイナリ述語です。


std::sort アルゴリズムのデフォルトの並べ替えルールの関数プロトタイプは次のとおりです。

template< class RandomIt >  
void sort( RandomIt first, RandomIt last );  
  • RandomIt first、RandomIt last パラメータ:この関数は、並べ替える必要があるシーケンス範囲を定義する2 つのランダム アクセス反復子 first と lastを受け入れます。
  • デフォルトの比較ルール:この範囲の要素は、デフォルトで < 演算子を使用して比較および並べ替えられます。カスタム クラスが < 演算子のオーバーロード関数を実装していない場合、エラーが報告される可能性があります。

std::sort アルゴリズムのカスタム並べ替えルールの関数プロトタイプは次のとおりです。

template< class RandomIt, class Compare >  
void sort( RandomIt first, RandomIt last, Compare comp );
  • RandomIt first、RandomIt last パラメータ:この関数は、並べ替える必要があるシーケンス範囲を定義する 2 つのランダム アクセス反復子 first と lastを受け入れます; 注: この範囲は、前部が閉じてから開く間隔です。
  • カスタム比較ルール comp パラメータの比較:このパラメータはバイナリ述語、つまり 2 つのパラメータを受け取りブール値を返す関数オブジェクトです。この範囲内の要素は、このバイナリ述語ルールを使用して並べ替えられます。

2. より大きな事前定義関数オブジェクト


C++ 標準テンプレート ライブラリ (STL、標準テンプレート ライブラリ) は、バイナリ述語であるgreat<T> 事前定義関数オブジェクトを提供します。この関数オブジェクトを使用すると、2 つの値を便利な方法で比較して、最初の値。2 番目の値より大きいかどうか。

この関数オブジェクトは主に STL アルゴリズムで、並べ替え順序、検索条件、その他のシナリオを制御するために使用されます。


great<T> 関数オブジェクトは、<function> ヘッダー ファイルで定義されており、比較する要素の型を指定するジェネリック型パラメーター T を受け入れます。

great<T> 関数オブジェクトは内部で関数呼び出し演算子 Operator() をオーバーロードするため、このクラスのインスタンス オブジェクトは通常の関数と同様に呼び出すことができます。





2. コード例 - 定義済み関数オブジェクト



1. コード例


コード例:

#include "iostream"
using namespace std;
#include <vector>
#include <algorithm>
#include "functional"

int main() {
    
    

	// 创建一个 set 集合容器
	vector<int> myVector;

	// 向容器中插入元素
	myVector.push_back(9);
	myVector.push_back(5);
	myVector.push_back(2);
	myVector.push_back(7);

	// 向 foreach 循环中传入 Lambda 表达式
	for_each(myVector.begin(), myVector.end(), [](int a) {
    
    
		std::cout << a << " ";
		});
	cout << endl;


	// 将 myVector 容器中的元素按照从大到小的顺序排列
	sort(myVector.begin(), myVector.end(), greater<int>());

	// 向 foreach 循环中传入 Lambda 表达式
	for_each(myVector.begin(), myVector.end(), [](int a) {
    
    
		std::cout << a << " ";
		});
	cout << endl;

	
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
};

2. 実行結果


の結果:

9 5 2 7
9 7 5 2
続行するには任意のキーを押してください。

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/han1202012/article/details/135493770