文章目录
- 1.常用排序算法
- 1. sort
- 2. random_shuffle
- 3. merge
- 4. reverse
- 2.常用拷贝和替换算法
- 1. copy
- 2. replace
- 3. replace_if
- 4. swap
- 3.常用算术生成算法
- 1. accumulate
- 2. fill
- 4.常用集合算法
- 1. set_intersection
- 2. set_union
- 3. set_difference
1.常用排序算法
在C++中,排序和相关操作是非常实用的功能。
1. sort
sort
函数是C++标准库提供的一个强大的排序算法,它能够对容器(如std::vector
、std::list
、std::deque
等)或数组中的元素进行排序。默认情况下,它执行升序排序,但也可以通过提供自定义比较函数来进行降序或其他定制排序。sort
位于<algorithm>
头文件中。
基本用法示例:
//
// Created by 86189 on 2024/7/10.
//
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;// 主函数,程序的入口点
int main(){// 初始化一个整数向量,包含一组待排序的数字vector<int>v = {1,3,2,6,5,7,4};// 对向量进行升序排序sort(v.begin(), v.end());// 遍历并打印排序后的向量for(int n : v){cout << n << " ";}cout << endl;// 对向量进行降序排序sort(v.begin(), v.end(),[](int &a,int &b){return a > b;});// 再次遍历并打印排序后的向量for(int n : v){cout << n << " ";}return 0;
}
2. random_shuffle
random_shuffle
函数用于将容器中的元素随机重新排列。不过需要注意的是,在C++14之后,random_shuffle
已经被标记为已弃用,推荐使用shuffle
函数,它提供了更好的随机性控制。random_shuffle
同样位于<algorithm>
头文件中。
基本用法示例 :
//
// Created by 86189 on 2024/7/10.
//
#include <iostream>
#include <algorithm>
#include <vector>
#include <random>
using namespace std;/* 主函数 */
int main(){/* 初始化一个整数向量,包含一组数字 */vector<int>v = {1,9,6,4,5,3,5};/* 初始化一个随机设备,用于生成随机数种子 */random_device rd;/* 使用Mersenne Twister算法初始化随机数生成器 */mt19937 g(rd());/* 使用随机数生成器对向量进行洗牌操作,以打乱其元素顺序 */shuffle(v.begin(), v.end(), g);/* 遍历并输出洗牌后的向量元素 */for(int n : v) cout << n << " ";return 0;
}
3. merge
merge
函数用于合并两个已排序的序列,将它们合并成一个新的有序序列。这通常与sort
配合使用于更复杂的排序算法中,如归并排序。它同样位于<algorithm>
头文件中。
基本用法示例:
//
// Created by 86189 on 2024/7/10.
//
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;// 主函数,演示如何使用标准库函数merge合并两个有序向量
int main(){// 初始化两个有序向量v1和v2vector<int>v1 = {1,3,5};vector<int>v2 = {2,4,6};// 初始化一个足够大的向量v3用于存放合并后的结果// 其大小为v1和v2的大小之和vector<int>v3(v1.size()+v2.size());// 调用标准库函数merge将v1和v2合并到v3中// 这里的merge函数假设输入的两个向量v1和v2是有序的// 合并后的向量v3仍然保持有序merge(v1.begin(), v1.end(),v2.begin(), v2.end(),v3.begin());// 遍历并打印合并后的向量v3for(int n : v3) cout << n << " ";return 0;
}
4. reverse
reverse
函数用于反转容器或数组中元素的顺序。它同样简单易用,只需提供起始和结束迭代器即可。此函数也在<algorithm>
头文件中定义。
基本用法示例:
//
// Created by 86189 on 2024/7/10.
//
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;// 主函数,程序的入口点
int main() {// 初始化一个整数向量v1,包含元素1, 3, 5vector<int> v1 = {1, 3, 5};// 翻转向量v1中的元素顺序reverse(v1.begin(), v1.end());// 遍历并打印翻转后的向量v1中的每个元素for(int n : v1) cout << n << " ";return 0;
}
2.常用拷贝和替换算法
在C++中,常用的拷贝和替换算法是处理容器或数组元素时非常基础且重要的操作。
1. copy
copy
函数用于将一个范围内的元素复制到另一个范围内。这个函数位于<algorithm>
头文件中。
基本用法示例:
// 包含标准库的头文件,用于输入输出和算法操作
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;// 程序的入口点
int main() {// 初始化源向量,包含一组整数vector<int> src = {1, 2, 3, 4};// 初始化目标向量,大小与源向量相同vector<int> dest(4);// 将源向量的内容复制到目标向量// 使用标准库算法copy进行复制操作copy(src.begin(), src.end(), dest.begin());// 遍历目标向量并打印每个元素// 用于展示复制操作的结果for(int n : dest) cout << n << " ";// 程序正常结束return 0;
}
2. replace
replace
函数用于在给定范围内查找指定的旧值,并将其替换为新值。它也位于<algorithm>
头文件中。
基本用法示例:
#include <algorithm> // 包含算法库,用于使用replace函数
#include <iostream> // 包含输入输出流,用于标准输出
#include <vector> // 包含向量容器,用于存储和操作整数序列
using namespace std;int main() {vector<int> src = {1, 2, 3, 4}; // 初始化一个整数向量,包含1, 2, 3, 4// 使用replace函数将向量src中所有的2替换为99// replace函数的作用是:在给定的范围内,找到所有与目标值相同的元素,并将其替换为新值replace(src.begin(), src.end(), 2, 99);// 遍历向量src,并打印每个元素// 这里使用范围for循环来遍历向量,展示replace操作后的结果for(int n : src) cout << n << " ";return 0; // 程序正常退出
}
3. replace_if
replace_if
函数类似于replace
,但它不是直接匹配值,而是基于谓词(一个返回bool值的函数或函数对象)来决定是否进行替换。当谓词对元素返回true
时,该元素会被替换。
基本用法示例:
#include <algorithm> // 使用标准库的算法
#include <iostream> // 使用标准库的输入输出流
#include <vector> // 使用标准库的向量容器
using namespace std;// 主函数,程序的入口点
int main() {// 初始化一个整数向量,包含1到4vector<int> src = {1, 2, 3, 4};// 使用replace_if算法替换向量中所有满足条件的元素// 条件是元素值为偶数,将其替换为99replace_if(src.begin(), src.end(), [](int n){return n%2==0;}, 99);// 遍历向量并打印每个元素for(int n : src) cout << n << " ";return 0; // 程序正常结束
}
4. swap
swap
函数用于交换两个对象的值。它可以用于内置类型,也可以用于自定义类型(只要这些类型重载了swap
函数或遵循移动语义)。对于标准库容器,可以直接调用它们的swap
成员函数,或者使用std::swap
函数,它位于<utility>
头文件中。
基本用法示例:
//
// Created by 86189 on 2024/7/10.
//
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;// 主函数,程序的入口点
int main() {// 初始化源向量vector<int> src = {1, 2, 3, 4};// 初始化目标向量vector<int> dest = {7,6,8,5,3,4};// 交换源向量和目标向量的内容// 说明:这里使用swap函数来交换两个向量的内容,目的是为了展示向量内容的交换过程swap(src, dest);// 遍历并打印源向量的内容for (int n : src) cout << n << " ";cout << endl;// 遍历并打印目标向量的内容for (int n : dest) cout << n << " ";return 0;
}
这些算法极大地简化了在C++中处理数据集合的任务,提高了代码的可读性和效率。
3.常用算术生成算法
在C++中,除了拷贝和替换算法外,算术生成算法也是处理数据集合时经常使用的工具。
1. accumulate
accumulate
函数用于计算一系列数值的总和(累积和)。此函数位于<numeric>
头文件中,可以接受一个初始值作为累积和的起始点。
基本用法示例:
//
// Created by 86189 on 2024/7/10.
//
#include <iostream>
#include <numeric>
#include <vector>
using namespace std;// 主函数,程序的入口点
int main(){// 初始化一个整数向量v,包含一组预设的整数vector<int>v = {1,10,2,3,5};// 使用accumulate函数对向量v中的所有元素进行累加,初始值为0// accumulate函数是标准库中用于累加的算法,这里展示了其在向量操作中的应用int sum = accumulate(v.begin(), v.end(),0);// 输出累加结果cout << sum << endl;// 程序正常结束return 0;
}
2. fill
fill
算法用于将一个范围内所有元素赋值为某个特定的值。它同样位于<algorithm>
头文件中。
基本用法示例:
//
// Created by 86189 on 2024/7/10.
//
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;// 主函数,程序的入口点
int main() {// 初始化一个长度为10的整数向量,所有元素初始值为0vector<int> vec(10, 0);// 使用标准库函数fill将向量的所有元素赋值为7fill(vec.begin(), vec.end(), 7);// 遍历向量并打印每个元素for(int num : vec)cout << num << " ";return 0;
}
这两个算法在处理数值集合时非常有用,accumulate
用于求和运算,而fill
则用于快速设置一系列值,比如初始化数组或向量等。
4.常用集合算法
集合算法在C++标准库中的<algorithm>
头文件里定义,它们主要用于处理集合(如数组、向量等容器)之间的数学集合操作。
1. set_intersection
set_intersection
算法用于找出两个已排序的集合的交集,并将结果存放到另一个集合中。集合需要是有序的,且不能有重复元素。
基本用法示例:
// 包含必要的头文件
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;// 主函数
int main(){// 初始化两个集合,分别包含一组整数set<int>s = {1,2,3,4,5,6};set<int>s1 = {2,4,6,8,10};// 初始化一个向量,用于存储两个集合的交集元素// 其大小预先估计为两个集合元素总数之和vector<int>v(s.size()+s1.size());// 使用set_intersection算法计算两个集合的交集// 并将结果存储在向量v中auto it = set_intersection(s.begin(), s.end(),s1.begin(), s1.end(),v.begin());// 调整向量的大小,以去除多余的未使用的空间// 它的大小现在等于交集中实际元素的数量v.resize(it - v.begin());// 遍历并打印向量中的元素,即两个集合的交集for(int n : v) cout << n << " ";// 程序正常退出return 0;
}
2. set_union
set_union
算法用于合并两个已排序的集合,去除重复元素,得到并集,并将结果存放到另一个集合中。
基本用法示例:
// 包含必要的头文件
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;// 主函数
int main(){// 初始化两个集合,分别包含一组不重复的整数set<int>s = {1,2,3,4,5,6};set<int>s1 = {2,4,6,8,10};// 初始化一个向量,大小为两个集合元素总数,用于存储合并后的结果vector<int>v(s.size()+s1.size());// 使用set_union算法将两个集合的元素合并到向量v中,重复的元素只出现一次// set_union算法返回一个迭代器,指向向量v中第一个未被写入的元素auto it = set_union(s.begin(), s.end(),s1.begin(), s1.end(),v.begin());// 根据返回的迭代器调整向量v的大小,使其正好包含所有合并后的元素v.resize(it - v.begin());// 遍历向量v,输出合并后的所有元素for(int n : v) cout << n << " ";return 0;
}
3. set_difference
set_difference
算法用于找出两个已排序的集合的差集,即第一个集合中存在但第二个集合中不存在的元素,并将结果存放到另一个集合中。
基本用法示例:
//
// Created by 86189 on 2024/7/10.
//
//#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;// 主函数
int main(){// 初始化两个集合,分别包含一组整数set<int>s = {1,2,3,4,5,6};set<int>s1 = {2,4,6,8,10};// 初始化一个向量,用于存储两个集合的差集结果vector<int>v(s.size()+s1.size());// 使用std::set_difference算法计算两个集合的差集// 并将结果写入向量v中auto it = set_difference(s.begin(), s.end(),s1.begin(), s1.end(),v.begin());// 调整向量的大小,使其正好包含所有差集元素v.resize(it - v.begin());// 遍历并输出向量中的差集元素for(int n : v) cout << n << " ";return 0;
}
这些算法都要求输入序列是预先排序的,并且对于set_intersection
和set_difference
来说,如果输入序列中有重复元素,结果只包含每个不同元素的一个实例。