C++ 实战:STL List 容器自定义排序深度解析
在 C STL 中 是一个双向循环链表。与 不同由于 的内存空间是不连续的它不能使用系统提供的标准算法stdsort而是内置了一个成员函数 。std::liststd::vectorlistsort()今天我们就通过一个“人员排序”的实例来看看如何利用 实现复杂的自定义排序逻辑。1. 为什么 list 需要自定义排序在处理基本数据类型如 或 时直接调用 即可实现升序。但当我们处理自定义类如 对象时编译器不知道应该按“年龄”排还是按“身高”排这时就需要我们提供一个排序规则回调函数。intfloatL.sort()person2. 核心代码实现以下代码展示了如何创建一个 类并按照“年龄升序为主身高降序为辅”的双重规则进行排序。person#includeiostream#includelist#includestringusing namespace std;// 1. 定义数据实体class person {public:person(string name, int age, int height) {this-name name;this-age age;this-height height;}string name;int age;int height;};// 2. 核心定义排序规则bool compareperson(person p1, person p2) {// 逻辑如果年龄相同则按身高降序排列if (p1.age p2.age) {return p1.height p2.height; // 降序前面的比后面大}// 逻辑如果年龄不同按年龄升序排列else {return p1.age p2.age; // 升序前面的比后面小}}// 打印函数void printList(const listperson L) {for (listperson::const_iterator it L.begin(); it ! L.end(); it) {cout 姓名 it-name \t年龄 it-age \t身高 it-height endl;}}void test01() {listperson L1;// 准备测试数据L1.push_back(person(张三, 22, 175));L1.push_back(person(李四, 29, 165));L1.push_back(person(王五, 81, 195)); // 年龄相同案例 AL1.push_back(person(赵六, 81, 145)); // 年龄相同案例 BL1.push_back(person(钱七, 38, 185));L1.push_back(person(孙八, 44, 180));cout 排序前 endl;printList(L1);// 3. 执行排序将自定义规则函数名作为参数传入L1.sort(compareperson);cout ---------------- endl;cout 排序后年龄升序年龄相同时身高降序 endl;printList(L1);}int main() {test01();return 0;}3. 技术要点拆解A. 排序算法的选择对于 容器我们通常使用 。但对于 由于其不支持随机访问迭代器必须使用成员函数vectorsort(L.begin(), L.end())listL1.sort(compareperson);B. 排序规则函数compareperson这个函数决定了两个元素的“前后关系”返回true代表 应该排在 前面。p1p2返回false代表 应该排在 后面。p1p2升序写法p1.val p2.val降序写法p1.val p2.valC. 多级排序逻辑在代码中我们通过 实现了嵌套逻辑。这在实际开发中非常实用比如在电商网站排序时可以先按价格排价格相同时再按评价排。if (p1.age p2.age)4. 总结使用 容器排序时记住以下三步走list定义规则编写一个返回类型为 的对比函数。bool调用成员使用 。list对象.sort(规则名)注意性能链表排序虽然不需要频繁移动内存只需改变指针指向但在大数据量下其效率仍低于基于数组的 排序。vector
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2430632.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!