記事ディレクトリ
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
続行するには任意のキーを押してください。。。