簡體   English   中英

為什么 std::less 是一個函子?

[英]why is std::less a functor?

為什么 less 是一個函子而不是像下面的 myless 這樣的模板化函數? 為什么委員會會做出這樣的決定,我可以去哪里進一步閱讀? C++11 標准是否也解釋了委員會做出某些決定的原因?

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

#if 1

template <class T> struct stdless {
  bool operator() (const T& x, const T& y) const {return x<y;}
  typedef T first_argument_type;
  typedef T second_argument_type;
  typedef bool result_type;
};

#else
    #define stdless std::less
#endif

//bool myless(int a, int b) { return a<b; }
template<class T>
bool myless(T a, T b) { return a<b; }

int main()
{
    vector<int> a{5, 3, 1,6};

    myless(5, 6);
    stdless<int>()(5, 6);

    auto fn1=stdless<int>();
    fn1(5,9);
    auto fn2=myless<int>;
    fn2(5,9);

    sort(a.begin(), a.end(), myless<int>);
    sort(a.begin(), a.end(), less<int>());

    for(auto b=a.begin(); b!=a.end(); ++b)
        cout << *b<<endl;
}

這有不同的原因。 第一個是編譯器在函子上內聯對operator()的調用比通過指向函數的指針內聯調用(當執行調用的代碼本身沒有內聯時)更容易。

除了性能優勢之外,還有更大的設計考慮因素,包括std::less<>函子的不同用途。 特別考慮任何已排序的容器,例如std::set<T,Comparator> 您不能將指針直接作為類型傳遞給函數,因此為了能夠使用myless ,集合的定義必須是std::set<T,bool (*)(T,T)> ,現在是下一個這里的問題是指針沒有合理的默認構造函數來執行您想要的操作,因此用戶代碼必須在構造容器時提供函數指針,這可能會導致錯誤。

std::set<int, bool(*)(int,int)> s(&myless);

忘記傳遞函數指針( std::set<int,bool(*)(int,int)> s; )很簡單,這會讓你得到錯誤的指針並導致未定義的行為。 在函子的情況下,這不是問題,編譯器將默認構造比較器成員,這將是一個有效的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM