值得一看
广告
彩虹云商城
广告

热门广告位

C++怎么自定义STL容器的比较函数_C++排序规则与仿函数实现方法

答案:C++中通过仿函数、lambda和函数指针自定义STL容器比较规则,实现灵活排序。1. 仿函数重载operator(),可携带状态且性能优,适用于set等容器;2. lambda表达式适合std::sort临时定义逻辑,但不能直接用于容器模板参数;3. 函数指针使用普通函数传参,灵活性差且有调用开销;4. 自定义类型需明确定义比较逻辑,如按学生分数排序,注意满足严格弱序避免未定义行为。

c++怎么自定义stl容器的比较函数_c++排序规则与仿函数实现方法

在C++中,自定义STL容器的比较函数是实现灵活排序和组织数据的关键。无论是使用 std::sort 对数组或vector排序,还是使用 std::setstd::map 等有序容器,都可以通过自定义比较规则来控制元素的排列顺序。

1. 仿函数(Functor)实现自定义比较

仿函数是重载了函数调用操作符 operator() 的类或结构体。STL 容器常用它作为比较器。

例如,定义一个仿函数让 std::set 按降序存储整数:

struct greater_cmp {
bool operator()(int a, int b) const {
return a > b;  // 降序
}
};
std::set<int, greater_cmp> s = {3, 1, 4, 1, 5};
// 遍历输出:5 4 3 1 1

仿函数的优势在于可携带状态,且编译期通常能被内联优化,性能较好。

立即学习“C++免费学习笔记(深入)”;

2. 使用Lambda表达式作为比较函数

C++11起支持lambda,适合临时定义简单逻辑。常用于 std::sort

std::vector<int> vec = {3, 1, 4, 1, 5};
std::sort(vec.begin(), vec.end(), [](int a, int b) {
return a > b;  // 降序排序
});

注意:lambda不能直接作为模板参数用于容器(如set),除非转换为function对象或使用auto(需配合变量模板),但通常推荐用仿函数或函数指针。

阿里云-虚拟数字人

阿里云-虚拟数字人

阿里云-虚拟数字人是什么? …

阿里云-虚拟数字人2

查看详情
阿里云-虚拟数字人

3. 函数指针方式

定义普通函数并传入其指针:

bool cmp_desc(int a, int b) {
return a > b;
}
std::set<int, bool(*)(int, int)> s(cmp_desc);

函数指针灵活性较低,无法捕获上下文,且可能带来间接调用开销。

4. 自定义复杂类型的排序规则

对结构体或类进行排序时,需明确比较逻辑。例如按学生分数排序:

struct Student {
std::string name;
int score;
};
struct cmp_student {
bool operator()(const Student& a, const Student& b) const {
return a.score > b.score;  // 分数高者优先
}
};
std::vector<Student> students = {{"Alice", 85}, {"Bob", 90}};
std::sort(students.begin(), students.end(), cmp_student{});

若用于set,则直接作为模板参数传入即可。

基本上就这些。掌握仿函数、lambda和函数指针的使用场景,就能灵活控制STL容器的排序行为。关键是要确保比较函数满足“严格弱序”(strict weak ordering),否则可能导致未定义行为。

相关标签:

c++ 排列 sort auto 结构体 Lambda 指针 函数重载 operator map function 对象

大家都在看:

C++怎么解决菱形继承问题_C++虚继承机制详解及菱形继承解决方法
c++怎么自定义类的拷贝构造函数和赋值运算符_c++类拷贝构造与赋值运算符实现方法
c++如何连接两个字符串_c++字符串拼接多种实现方法
c++中如何读取文本文件的内容_c++文件读取操作的常见方法总结
c++如何使用正则表达式_c++正则regex库使用教程
温馨提示: 本文最后更新于2025-10-22 16:31:36,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞14赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容