介绍
algorithm意为”算法”,是C++的标准模版库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模板函数。
类 别 C++标准库
头文件 #include <algorithm>
命名空间 using namespace std;
常用函数
1.序列操作:
max() //返回两个元素中值最大的元素
min() //返回两个元素中值最小的元素
abs() //返回元素绝对值
next_permutation() //返回给定范围中的元素组成的下一个按字典序的排列
2.修改内容操作:
swap() //交换两个对象的值
reverse() //反转排序指定范围中的元素
fill() //将一个范围的元素赋值为给定值
3.排序操作:
sort() //按一定方法排序,默认升序
4.查找操作:
lower_bound() //在指定区域内查找不小于目标值的第一个元素的位置(大于等于)
upper_bound() //在指定范围内查找大于目标值的第一个元素的位置
#include <iostream>
#include <algorithm>
#include <numeric>
using namespace std;
int main()
{
//使用STL容器时将数组地址改为迭代器即可
int a[5] = { 1, 2, 3, 4, 5 };
//排序算法
sort(a, a + 5);//将区间[0, 5)内元素按字典序从小到大排序
sort(a, a + 5, greater<int>());//将区间[0, 5)内元素按字典序从大到小排序
reverse(a, a + 5);//将区间[0, 5)内元素翻转
nth_element(a, a + 3, a + 5);//将区间[0, 5)中第a + 3个数归位,即将第3大的元素放到正确的位置上,该元素前后的元素不一定有序
//查找与统计算法
find(a, a + 5, 3);//在区间[0, 5)内查找等于3的元素,返回迭代器,若不存在则返回end()
binary_search(a, a + 5, 2);//二分查找区间[0, 5)内是否存在元素2,若存在返回true否则返回false
count(a, a + 5, 3);//返回区间[0, 5)内元素3的个数
//可变序列算法
copy(a, a + 2, a + 3);//将区间[0, 2)的元素复制到以a+3开始的区间,即[3, 5)
replace(a, a + 5, 3, 4);//将区间[0, 5)内等于3的元素替换为4
fill(a, a + 5, 1);//将1写入区间[0, 5)中(初始化数组函数)
unique(a, a + 5);//将相邻元素间的重复元素全部移动至末端,返回去重之后数组最后一个元素之后的地址
remove(a, a + 5, 3);//将区间[0, 5)中的元素3移至末端,返回新数组最后一个元素之后的地址
//排列算法
next_permutation(a, a + 5);//产生下一个排列{ 1, 2, 3, 5, 4 }
prev_permutation(a, a + 5);//产生上一个排列{ 1, 2, 3, 4, 5 }
//前缀和算法
partial_sum(a, a + 5, a);//计算数组a在区间[0, 5)内的前缀和并将结果保存至数组a中
return 0;
}
————————————————
版权声明:本文为CSDN博主「柃歌」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_51755720/article/details/120616163
一些详细说明
max(x,y)
返回两个值中的最大数。
注意: 如果参数不包含数字,函数 MAX 返回 0。
min(x,y)
从给定的两个值中查找最小值,它接受两个值并返回最小值,如果两个值相同,则返回第一个值。
注意:max和min的参数必须是两个。
abs(x)
返回x的绝对值。x必须为整数,浮点型的绝对值要用math头文件下的fabs。
如果没有头文件,绝对值返回0。
swap(a,b)
交换两个对象的值,即交换a和b的值。
reverse(start,end)
1.将区间内元素全部逆序,常用于数组,字符串,容器等。
2.容器类型的要用begin()和end()来指定反转的区域,数组类型的直接用int类型即可。
3.reverse函数用于反转在[first,last)范围内的顺序(包括first指向的元素,不包括last指向的元素),reverse函数没有返回值。
vector<int> v = {5,4,3,2,1};
reverse(v.begin(),v.end());//v的值为1,2,3,4,5
string str="www.mathor.top";
reverse(str.begin(),str.end());//str结果为pot.rohtam.www
next_permutation(arr,arr+n,cmp)
注意:使用前需对欲排列数组按升序排列,否则只能找出该序列后的全排列数。
返回给定范围中的元素组成的下一个按字典序的排列。
n用于指定全排列的前几位,也可以自定义排序方式cmp。
int num[3]={1,2,3};
do{
cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<endl;
}while(next_permutation(num,num+n));
fill(arr, arr+n, val)
给区间内所有元素赋一个值。
vector<int> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
fill(vector.begin(), vector.end(), -1);
sort(start,end,cmp)
排序。
默认升序排列,cmp为排序方法。
bool compare(int a,int b)
{
return a>b;
}
sort(a,a+10,compare);//降序排列①
int arr[] = { 2, 4, 5, 3, 1 };
sort(arr, arr + 5, greater<int>());//降序排列②
lower_bound(start,end,val)和upper_bound(start,end,val)
·使用二分查找在一个排好序(升序)的数组或容器中查找。
函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置
返回的是地址。
注意:如果所有元素都小于val,则返回last的位置,且last的位置是越界的。
函数upper_bound()返回的在前闭后开区间查找的关键字的上界,返回大于val的第一个元素位置
注意:返回查找元素的最后一个可安插位置,也就是“元素值>查找值”的第一个元素的位置。同样,如果val大于数组中全部元素,返回的是last。(注意:数组下标越界)
感谢
写的真全面!
希望能帮到您