C++ std::使用运算符重载按降序排序
我有一个对象的C++ std::使用运算符重载按降序排序,c++,sorting,c++11,std,C++,Sorting,C++11,Std,我有一个对象的std::vector,我为其重载了,您可以借助std::bind,简单地将参数转换为std::less: using namespace std::placeholders; std::sort(v.begin(), v.end(), std::bind(std::less<T>{}, _2, _1)); 使用名称空间std::占位符; 排序(v.begin(),v.end(),std::bind(std::less{},_2,_1)); 但我认为简单地编写等效的
std::vector
,我为其重载了,您可以借助std::bind
,简单地将参数转换为std::less
:
using namespace std::placeholders;
std::sort(v.begin(), v.end(), std::bind(std::less<T>{}, _2, _1));
使用名称空间std::占位符;
排序(v.begin(),v.end(),std::bind(std::less{},_2,_1));
但我认为简单地编写等效的短lambda会更简洁,即使它违背了不编写自己的比较器的约束:
std::sort(v.begin(), v.end(), [](T const& lhs, T const& rhs) { return rhs < lhs; });
排序(v.begin(),v.end(),[](T const&lhs,T const&rhs){return rhs
您可以使用std::sort
对数组进行排序,然后使用std::reverse
将其反转。这将按您想要的方式排序
std::sort(v.begin(), v.end());
std::reverse(v.begin(), v.end());
std::排序(开始(v)、结束(v)、std::更大)代码>std::sort(v.rbegin(),v.rend())代码>从C++14开始,比较函数有一个专门化,通过传递void
作为模板参数来实现。同时,如果未指定任何模板参数,则标准使void
成为默认模板参数。语法std::greater
用默认值实例化对象arguments@GuyGreer但是该对象仍然需要实例化,即,std::greater()
甚至std::greater
,而std::greater
与not2(std::less)
不同,我很确定他们在排序时会给出相同的结果…@GuyGreerstd::greer
使用操作符>
,而不是operator@Barry嘿,这是一个很好的调用,我认为它确实存在,尽管不是这个名字:std::bind(std::less(),std::placeholders:::_2,std::placeholders::_1)
。lambda违背了OP声明的不创建自定义比较器的要求<代码>标准::绑定
没有。然而,看到这种混乱局面,我希望OP能改变主意,不管怎样,还是选择lambda这看起来像UB:如果对[1,1]
进行排序,两个比较都将生成true
。
std::sort(v.begin(), v.end());
std::reverse(v.begin(), v.end());