C++中sort,upper_bound,lower_bound,*max_element,unique用法介绍

本文详细介绍了C++标准模板库(STL)中的排序与搜索算法,包括sort函数的基本使用、max_element获取最大值的方法、unique去重操作、upper_bound与lower_bound的二分查找技巧等。

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

1.sort:sort(fast,last,排序方式),sort排序函数是对[fast,last)前开后闭区间内元素进行排序,fast是数组首地址,last是数组尾地址的下一个地址。如sort(a,a+n,cmp),

如果不加排序方式则是默认由小到大排序。

2.*max_element:*max_element(fast,last)该函数也是对[fast,last)前闭后开区间内进行求数组中最大值的操作。

3.unique:unique(fast,last)函数是对[fast ,last)区间内去除相邻的重复元素,往往要先对数组排序,在头文件#include<algorithm>目录下。且并不是把重复元素删除了,而是把重复的元素排在数组后面,返回值是去重后最后一个元素的尾地址,例如:

a[6]={1,2,2,3,3,5};那么unique(a,a+6)-a的值就是4,而不是3,区别于本文其他的函数返回值。

4.upper_bound:upper_bound(fast,last,n)是[fast,last)区间用二分查找找到第一个大于n的值,返回值为第一个大于n的值的地址,例如:upper_bound(a,a+n,k)-a的值的实际上就是第一个大于k的元素的下标,如果n大于数组中的全部元素,则返回last。

5.lower_bound:lower_bound(fast,last,n)是[fast,last)区间二分查找第一个大于等于n的值,返回值为第一个大于等于n的值的地址,其他同upper_bound函数。

如有错误希望大家能提醒一下,在下马上改正。微笑

<think>好的,用户想了解C++中algorithm库的常用函数。首先,我需要回忆一下algorithm库的主要内容,确保覆盖常用函数。 首先想到的是排序相关的函数,比如sort,应该是最常用的。然后可能需要介绍stable_sort,还有对已排序容器的操作,比如binary_search、lower_bound这些。接下来是查找类函数,比如find、find_if,还有计数用的count和count_if。 然后是关于修改容器内容的函数,比如copy、fill、replace这些。还有移除元素的remove和unique。可能需要提到排列相关的next_permutation,虽然实际使用可能不太多,但也是标准库的一部分。 另外,最大最小值函数,比如min、max,以及minmax和min_element这些。还有比较范围的equal和mismatch。可能还需要提到swap,虽然这个在utility里,但有时候也会用到。 需要确保每个函数都给出简要的用法示例,比如sort的第三个参数是比较函数,find返回迭代器等。要注意说明这些函数的使用场景和注意事项,比如sort是原地排序,复杂度是O(n log n)等。 用户可能是刚开始学习C++,需要结构清晰的回答,分点列出函数,每个函数有例子和说明。要避免过于技术性的术语,但又要准确。需要检查是否有遗漏的重要函数,比如reverse、rotate这些,也是常用的。 可能需要注意中文术语的准确性,比如“迭代器”这样的词汇是否正确。还要提醒用户algorithm库中的函数大多在std命名空间下,使用时需要包含头文件#include <algorithm>。 总结下来,应该分几个大类来介绍,比如排序、查找、修改、比较等,每个类别下列举常用函数,给出示例和用途。这样用户能逐步了解每个函数的作用和使用方法。</think>C++ 的 `<algorithm>` 库提供了丰富的通用算法函数,以下是常用函数分类及示例: --- ### 一、排序相关 1. **`sort`** 对范围进行升序排序(默认)或自定义比较 ```cpp vector<int> v = {5, 3, 1, 4, 2}; sort(v.begin(), v.end()); // 1,2,3,4,5 sort(v.begin(), v.end(), greater<int>()); // 降序 ``` 2. **`stable_sort`** 稳定排序(相等元素保留原顺序) ```cpp stable_sort(v.begin(), v.end()); ``` 3. **`binary_search`** 在已排序范围内二分查找 ```cpp if (binary_search(v.begin(), v.end(), 3)) { // 找到元素 } ``` 4. **`lower_bound` / `upper_bound`** 返回第一个 ≥ 目标值的迭代器 / 第一个 > 目标值的迭代器 ```cpp auto it = lower_bound(v.begin(), v.end(), 3); ``` --- ### 二、查找与计数 1. **`find` / `find_if`** 查找第一个匹配元素 ```cpp auto it = find(v.begin(), v.end(), 3); // 查找值为3的元素 auto it = find_if(v.begin(), v.end(), [](int x){ return x%2 == 0; }); // 查找第一个偶数 ``` 2. **`count` / `count_if`** 统计匹配元素的数量 ```cpp int n = count(v.begin(), v.end(), 3); // 统计值为3的元素数量 int n = count_if(v.begin(), v.end(), [](int x){ return x > 3; }); // 统计>3的元素数量 ``` --- ### 三、修改容器内容 1. **`copy`** 复制范围到目标位置 ```cpp vector<int> dest(5); copy(v.begin(), v.end(), dest.begin()); ``` 2. **`fill`** 填充范围为指定值 ```cpp fill(v.begin(), v.end(), 0); // 全部赋值为0 ``` 3. **`replace` / `replace_if`** 替换满足条件的元素 ```cpp replace(v.begin(), v.end(), 3, 0); // 将3替换为0 replace_if(v.begin(), v.end(), [](int x){ return x < 3; }, 0); // 将<3的元素替换为0 ``` 4. **`remove` / `remove_if`** 移除满足条件的元素(需配合`erase`) ```cpp auto new_end = remove(v.begin(), v.end(), 3); v.erase(new_end, v.end()); // 实际删除元素 ``` 5. **`unique`** 去除相邻重复元素(需先排序) ```cpp auto last = unique(v.begin(), v.end()); v.erase(last, v.end()); ``` --- ### 四、数值操作 1. **`max` / `min`** 返回两个值的较大/较小值 ```cpp int a = max(3, 5); // 返回5 ``` 2. **`minmax`** 返回包含最小值和最大值的`pair` ```cpp auto [min_val, max_val] = minmax({3,1,4,5}); ``` 3. **`max_element` / `min_element`** 返回范围中最大/最小元素的迭代器 ```cpp auto it = max_element(v.begin(), v.end()); ``` --- ### 五、排列与组合 1. **`next_permutation`** 生成下一个字典序排列 ```cpp string s = "abc"; do { cout << s << endl; } while (next_permutation(s.begin(), s.end())); ``` --- ### 六、其他常用 1. **`reverse`** 反转范围 ```cpp reverse(v.begin(), v.end()); ``` 2. **`rotate`** 旋转范围(将中间元素移动到开头) ```cpp rotate(v.begin(), v.begin() + 2, v.end()); ``` 3. **`shuffle`** 随机打乱顺序(需传入随机引擎) ```cpp random_device rd; mt19937 gen(rd()); shuffle(v.begin(), v.end(), gen); ``` --- ### 使用注意 1. 需要包含头文件:`#include <algorithm>` 2. 所有函数均位于 `std` 命名空间 3. 参数多为迭代器范围(`begin`, `end`) 这些函数能极大简化代码逻辑,建议结合具体场景灵活使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值