用于std::sort()的c++自定义比较函数
c++ custom compare function for std::sort()
我想为std::sort()创建自定义比较函数,对一些键值对std::pair进行排序
这是我的函数
template <typename K, typename V>
int comparePairs(const void* left, const void* right){
if((((pair<K,V>*)left)->first) <= (((pair<K,V>*)right)->first))
return 1;
else
return -1;
}
那么,在某个类中,我有一对向量的类成员:
vector<pair<K,V>> items;
和一些按键排序vector的方法,使用std::sort()
std::sort(items.begin(), items.end(), comparePairs<K,V>);
里面有编译错误,上面写着
"无法将参数number从'std::pair<_Ty1,_Ty2>'转换为'const 'void *"
。什么是错误?
看这里:http://en.cppreference.com/w/cpp/algorithm/sort.
它说:
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
-
comp -比较函数,如果第一个参数小于第二个参数,返回true。比较函数的签名应等效如下:
bool cmp(const Type1 &a, const Type2 &b);
另外,这里有一个如何使用自定义c++ 14多态lambda来使用std::sort
的示例:
std::sort(std::begin(container), std::end(container),
[] (const auto& lhs, const auto& rhs) {
return lhs.first < rhs.first;
});
std::pair已经有了所需的比较操作符,它使用每个pair的两个元素执行字典顺序比较。要使用它,您只需要为类型K
和V
提供类型的比较运算符。
还要记住,std::sort
要求严格弱序比较,而<=
不满足这一点。例如,您需要对K
和V
进行小于比较<
。有了它,你所需要的就是
std::vector<pair<K,V>> items;
std::sort(items.begin(), items.end());
如果您确实需要提供自己的比较函数,那么您需要一些类似
的内容。template <typename K, typename V>
bool comparePairs(const std::pair<K,V>& lhs, const std::pair<K,V>& rhs)
{
return lhs.first < rhs.first;
}
你的比较函数根本没有错。
它的参数应该是存储在范围内的类型,即std::pair<K,V>
,而不是const void*
。
它应该返回bool
,而不是正负值。(bool)1
和(bool)-1
都是true
,所以你的函数说每个对象在所有其他对象之前排序,这显然是不可能的。
您需要建模小于操作符,而不是strcmp
或memcmp
风格的比较。
请参阅StrictWeakOrdering,其中描述了函数必须满足的属性。
相关文章:
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- C++自定义比较函数
- 如何比较自定义类的std::变体
- std::设置自定义比较器
- 如何正确实现和访问运算符的各种自定义枚举器
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 自定义先决条件对移动分配运算符有效吗
- 使用VS Code和CMake Tools运行自定义命令
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- std::ranges::elements_view,用于自定义类似元组的数据
- 跟随整数索引列表的自定义类迭代器
- 参数化自定义CMake工具链
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 如何在自定义类中启用'auto loops'?
- 使用QJsEngine在Qt中注册自定义类型
- Qt自定义QPush按钮未显示在布局上
- 自定义对象的dlib序列化在gcc中失败
- 自定义创建QFuture
- 如何在QT中的自定义视频小工具t上绘制矩形