gpt4 book ai didi

c++ - 为什么 std::less 是一个仿函数?

转载 作者:行者123 更新时间:2023-11-30 01:20:57 27 4
gpt4 key购买 nike

为什么 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; ) 很简单,这会让您得到错误的指针并导致未定义的行为。对于仿函数,这不是问题,编译器将默认构造比较器成员,这将是一个有效对象。

关于c++ - 为什么 std::less 是一个仿函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18700731/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com