获取所需属性的比较器
Comparer that takes the wanted attribute
为了在一些标准容器Container<T>
上使用类似std::sort
的标准函数
struct T{
int x,y;
};
基于y
值,您需要编写类似(例如(:
std::vector<T> v;
//fill v
std::sort(v.begin(),v.end(),[](const auto& l,const auto& r){
return l.y<r.y;
});
编写为lambda函数的比较器使用过多,在编写各种类和属性的代码时会一次又一次地重写。
考虑到y
的类型是可比较的(要么像int
,要么< operator
过载(,有什么方法可以实现这样的东西吗:
std::sort(v.begin(),v.end(),imaginary::less(T::y)); // Imaginary code
在C++中有可能写出像less
这样的函数吗?或者类似的东西?
我之所以这么问,是因为我记得一些托管语言中的类似内容(我不确定可能是C#或Java(。然而,我甚至不确定这些信息是否属实。
template<typename T, typename MT>
struct memberwise_less
{
MT T::* const mptr;
auto operator()(const T& left, const T& right) const
{ return (left.*mptr) < (right.*mptr); }
};
template<typename T, typename MT>
memberwise_less<T, MT> member_less(MT T::*mptr)
{
return { mptr };
}
然后你可以做
std::sort(v.begin(), v.end(), member_less(&T::y));
相关文章:
- std::设置自定义比较器
- C++中"std::sort"比较器的不同类型
- 将 std::set 与基于键的比较器一起使用
- 带自定义比较器的最小优先级队列
- 函数类作为比较器
- 优先级队列自定义比较器
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- 没有默认构造函数作为模板参数的自定义比较器
- set_intersection使用自定义设置比较器
- 如何为集合 c++ 建立比较器
- C++复杂情况的比较器通过参数问题
- 对于BTreeMap和其他依赖于Ord的东西,是否有等效于C++比较器对象?
- 对没有比较器或λ函数的向量进行排序?
- "operator()"在重载运算符方法中是什么意思,在priority_queue(STL)中用作C++中的比较器?
- 用户定义的结构是否有默认C++比较器?
- C++设置了一个用于排序的比较器和另一个用于唯一性的比较器
- 使用迭代器的自定义比较器函数
- C++对λ比较器EXC_BAD_ACCESS进行排序
- 基于对象的两个属性的自定义比较器会引发异常
- 获取所需属性的比较器