C ++入門書の5番目の注意事項(第14章オーバーロード算術および型変換)標準ライブラリ関数オブジェクト

1.定義

標準ライブラリによって定義されたライブラリ定義関数オブジェクト:標準ライブラリは、ヘッダーファイル関数内の算術演算子、関係演算子、および論理演算子を表すクラスのセットを定義します。各クラスは、名前付き操作の呼び出し演算子を定義します。
これらのクラスはテンプレートの形式で定義され、特定のアプリケーションタイプ(つまり、呼び出し演算子のパラメータータイプ)を指定できます。
例えば。

vector<string> svec = {
    
     "a31", "b1" };
sort(svec.begin(), svec.end(), greater<string>());
for_each(svec.begin(), svec.end(), [](const string& s)
    {
    
    std::cout << s << endl; });

plus<int> intAdd;	//可执行int加法的函数对
negate<int> intNegate;	//可对int值取反的函数对象
int sum = intAdd(10, 20);	//sum=30
std::cout << sum << endl;
sum = intAdd(10, intNegate(10));	//sum=0
std::cout << sum << endl;

出力結果は次のとおりです。

b1
a31
30
0

2.標準ライブラリ関数オブジェクトのリスト:

算術 関係 論理
プラス に等しい 論理積
マイナス not_equal_to logical_or
乗算します 大きい logical_not
分水界 great_equal
係数 もっと少なく
否定する less_equal

3.ポインタを比較できます

例えば。

//lambda表达式是比较两个字符串大小
  string a1 = "b1";
  string b1 = "a1";
  vector<string*> nameTable = {
    
    &a1 , &b1};    // vector of pointers
   
  sort(nameTable.begin(), nameTable.end(),          
     [](string* a, string* b) {
    
     return *a < *b; });
   for_each(nameTable.begin(), nameTable.end(), [](string* s)
             {
    
    std::cout << *s << endl; });
//标准库比较两个指针的内存地址, 
 vector<string*> nameTable2 = {
    
     &a1 , &b1 };    // vector of pointers 
 sort(nameTable2.begin(), nameTable2.end(), less<string*>());
 for_each(nameTable2.begin(), nameTable2.end(), [](string* s)
             {
    
    std::cout << *s << endl; });

出力:

a1
b1
b1
a1

[見積もり]

[1]コードfunctionObject.h

おすすめ

転載: blog.csdn.net/thefist11cc/article/details/114163441