STL中sort的用法举例

本文介绍了使用C++进行对象数组排序的方法,包括定义比较函数和通过重载比较运算符实现排序,并展示了如何利用STL中的sort函数结合自定义比较方式对数组及vector容器进行升序和降序排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


date:2010-07-02
对象数组排序这里展示了两种方法,定义比较函数或通过重载比较运算符使得类本身是可以比较的,就像基本类型一样。
定义比较函数,既可以通过定义比较运算符(如operator <),也可以直接定义函数(如compare)。
重载运算符之后,可以在sort函数中通过less或greater或less_equal等来调整升序还是降序,默认是升序。
另外,重载运算符后,函数bool operator < 就不要了,否则用g++编译出错。

 

参考:http://www.cppblog.com/mzty/archive/2009/11/17/1770.html

<think>好的,我现在需要向用户介绍C++中STL的功能与用法。首先,我得回忆一下STL的基本概念。STL是标准模板库,提供了一系列通用的模板类和函数,包括容器、算法、迭代器、函数对象等。用户可能想了解这些组成部分的具体内容以及如何使用它们。 接下来,我需要确定回答的结构。按照用户的要求,结构要清晰,逐步解决问题。所以应该分点介绍各个部分,比如容器、算法、迭代器、函数对象和适配器。每个部分需要给出功能、常见组件以及示例代码,这样用户能更好地理解。 关于容器部分,需要提到顺序容器如vectorlist、deque,关联容器如set、map,以及无序关联容器如unordered_set。每个容器要简要说明其特点和使用场景。例如,vector类似于动态数组,支持随机访问;list是双向链表,插入删除高效。 然后是算法,STL提供了大量泛型算法,如排序、查找、遍历等。需要提到sort、find、for_each这些常用函数,并强调它们通过迭代器操作容器,与容器实现解耦。这体现了STL的灵活性和高效性。 迭代器作为容器和算法之间的桥梁,必须详细说明其类型,如输入、输出、前向、双向、随机访问迭代器。例如,vector的迭代器是随机访问的,而list的是双向的。需要举例说明如何使用迭代器遍历容器,比如用begin()和end()获取迭代器范围。 函数对象部分,可以提到仿函数,比如greater<int>用于排序,以及lambda表达式的结合使用。这部分可能需要举例说明如何在sort中使用自定义比较函数。 适配器如stack、queue和priority_queue,虽然基于其他容器实现,但提供了特定的接口。需要指出它们的默认底层容器,比如stack默认用deque,priority_queue默认用vector。 另外,用户可能需要代码示例来更好地理解用法。比如,展示vector的声明、添加元素、排序,以及使用迭代器遍历。同时,演示如何使用算法如find和sort,并说明需要包含的头文件,如<algorithm>。 需要注意用户的系统级指令,特别是LaTeX格式的正确使用。行内数学表达式用$...$,独立公式用$$...$$,但在这个问题中可能涉及较少数学公式,但如果有提及算法复杂度,可能需要使用,比如O(n log n)。 还要检查LaTeX语法是否正确,比如变量用$括起来,但用户的问题主要关于C++,可能涉及的数学内容不多,所以重点放在代码示例和结构上。 需要确保回答用中文,并且结构清晰,分点列出各个部分的功能和用法,每个部分配合示例代码。同时,要强调STL的优势,如代码复用、高效性和灵活性。 最后,总结STL的重要性,建议用户多练习以掌握常用组件。可能还需要提醒用户注意一些常见问题,比如迭代器失效、容器选择的影响等,但用户的问题主要是功能和用法介绍,所以可能不需要深入这些细节,除非用户后续提问。 现在,将这些思路整理成一个连贯的回答,确保每个部分有明确的标题,代码示例正确,并且符合用户要求的格式。</think>### C++ STL 的功能与用法详解 STL(Standard Template Library,标准模板库)是 C++ 标准库的核心组成部分,提供了一系列**通用模板化组件**,用于实现高效的数据结构和算法。其核心思想是“泛型编程”,通过将数据结构和算法解耦,显著提升代码复用性。以下是 STL 的核心组件及用法: --- #### 一、容器(Containers) 功能:存储和管理数据集合,分为三类: 1. **顺序容器** - `vector`:动态数组,支持快速随机访问(时间复杂度:$O(1)$),尾部插入高效。 - `list`:双向链表,任意位置插入/删除高效($O(1)$),但不支持随机访问。 - `deque`:双端队列,支持头尾快速插入/删除。 ```cpp #include <vector> std::vector<int> v = {3, 1, 4}; v.push_back(5); // 添加元素 ``` 2. **关联容器**(基于红黑树,有序) - `set`/`multiset`:唯一/重复元素集合,自动排序。 - `map`/`multimap`:键值对映射,按键排序。 ```cpp #include <map> std::map<std::string, int> m; m["Alice"] = 25; // 插入键值对 ``` 3. **无序关联容器**(基于哈希表,C++11 引入) - `unordered_set`/`unordered_map`:快速查找(平均 $O(1)$),元素无序。 ```cpp #include <unordered_set> std::unordered_set<int> s = {5, 2, 8}; ``` --- #### 二、算法(Algorithms) 功能:提供通用算法,通过迭代器操作容器,与具体数据类型无关。 - **常用算法**: - `std::sort()`:排序(平均复杂度 $O(n \log n)$)。 - `std::find()`:线性查找($O(n)$)。 - `std::for_each()`:遍历容器。 ```cpp #include <algorithm> std::vector<int> v = {3, 1, 4}; std::sort(v.begin(), v.end()); // 排序后 v = [1, 3, 4] ``` --- #### 三、迭代器(Iterators) 功能:充当容器与算法之间的桥梁,提供统一的访问接口。 - **类型**: - `输入/输出迭代器`:单向遍历(如读取流)。 - `前向迭代器`:单向移动(如单链表)。 - `双向迭代器`:可前后移动(如 `list`)。 - `随机访问迭代器`:支持跳跃访问(如 `vector`)。 ```cpp std::vector<int> v = {1, 2, 3}; for (auto it = v.begin(); it != v.end(); ++it) { std::cout << *it << " "; // 输出 1 2 3 } ``` --- #### 四、函数对象(Functors)与 Lambda 功能:行为类似函数的对象,可自定义操作逻辑。 - **示例**: ```cpp #include <algorithm> std::vector<int> v = {5, 2, 8}; // 使用仿函数排序(从大到小) std::sort(v.begin(), v.end(), std::greater<int>()); // 使用 Lambda 表达式 std::for_each(v.begin(), v.end(), [](int x) { std::cout << x; }); ``` --- #### 五、适配器(Adapters) 功能:基于现有容器封装特殊接口。 - **常见适配器**: - `stack`:后进先出(默认基于 `deque`)。 - `queue`:先进先出(默认基于 `deque`)。 - `priority_queue`:优先级队列(默认基于 `vector`)。 ```cpp #include <stack> std::stack<int> s; s.push(10); // 入栈 s.pop(); // 出栈 ``` --- ### 总结 **STL 优势**: - **代码复用**:通用模板减少重复代码。 - **高效性**:底层优化(如红黑树、哈希表)。 - **灵活性**:容器与算法解耦,支持自定义扩展。 **学习建议**:从 `vector`、`map`、`sort` 等常用组件入手,逐步掌握迭代器和算法搭配。注意迭代器失效问题(如 `vector` 插入元素可能导致迭代器失效)和容器选择对性能的影响(如频繁插入选择 `list`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值