c++ <algorithm> swap 函数 reverse 函数 remove 函数

本文介绍了C++中<algorithm>库的三个重要函数:swap()用于交换元素,reverse()用于反转序列,remove()则用于移除指定元素。详细阐述了每个函数的用法,提供了示例代码,特别是remove()函数,它并不直接删除元素,而是将目标元素移到序列末尾,需要配合erase()使用。

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

1. swap()

swap(a,b)

2. reverse()

reverse函数用于反转在[first,last)范围内的顺序,reverse函数没有返回值

例子:交换vector容器中元素的顺序

vector<int> v = {5,4,3,2,1};
reverse(v.begin(),v.end());//v的值为1,2,3,4,5

例子: 还有string类的字符串

string str="www.mathor.top";
reverse(str.begin(),str.end());//str结果为pot.rohtam.wwww

3.  remove() 

如果要删除容器中和指定元素值相同的所有元素,可以使用 remove() 函数,该函数定义在 <algorithm> 头文件中。例如

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    vector<int>demo{ 1,3,3,4,3,5 };
    //交换要删除元素和最后一个元素的位置
    auto iter = std::remove(demo.begin(), demo.end(), 3);
    cout << "size is :" << demo.size() << endl;
    cout << "capacity is
<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、付费专栏及课程。

余额充值