通过#include <algorithm>
可以非常简便地使用各类封装成熟的算法
max_element / min_element
返回一个序列的 最大/最小 元素的指针,需要用 *
符号去获得对应的值
vector<int> nums{1,3,5};
int p[] = {2,3,4};
int m1 = *max_element(nums.begin(), nums.end());
int m2 = *max_element(&p[0], &p[sizeof(p)/4]); // sizeof(p) / 4 = 3
__gcd
返回两个数的最大公约数,注意前面有两个下划线
int a = __gcd(10, 4);
accumulate
累积求和
int sum = accumulate(vec.begin(), vec.end(), 0); // 求vector<int>容器内所有数的和
int sum = accumulate(&nums[0], &nums[100], 0); // 对数组求和
distance
计算两个迭代器之间的距离,可用于vector
,multiset
等容器的迭代器
vector<int> a {1, 2, 3};
int b = distance(a.begin(), end(a)); // 3
数组填充fill
和fill_n
fill
函数接收三个参数,以前两个迭代器参数为开始和结尾,用第三个常量参数填充整个序列 !
vector<int> a(10); // 初始化时每个都是0
fill(begin(a), end(a), 100); // 将 a 的全部10个元素设置成100
fill_n
的三个参数分别是起始迭代器,要修改的元素个数,和设置成的常量的值!
二分搜索算法
lower_bound
, upper_bound
提供二分查找的函数,注意要提供一个有序的序列
upper_bound
返回第一个大于的元素的下标; (类似于python的bisect.bisect_right
)
lower_bound
返回第一个大于等于元素的下标; (类似于python的bisect.bisect_left
)
注意要减去开始位置的指针,才能得到相应的索引值
vector<int> nums{1, 2, 3, 4, 5};
int k = upper_bound(nums.begin(), nums.end(), 4) - nums.begin();
// k = 4
int k = upper_bound(nums.begin(), nums.end(), 100) - nums.begin();
// k = 5,即如果 值大于容器中的所有元素,返回容器的长度
int p[5] = {1, 4, 9, 10, 14};
k = lower_bound(p, p + 5, 0) - p; // 数组的用法类似,这里 k = 0
binary_search
返回一个bool
值,表示序列中是否存在等于val
的元素;可以在最后接一个比较函数
vector<int> v1{ 10,9,8,7,6,4,3,2,
vector<int> v2{ 1,2,3,4,6,7,8,9,10 };
bool b1 = std::binary_search(v1.begin(), v1.end(), 6); //b1==false,
bool b2 = std::binary_search(v2.begin(), v2.end(), 6); //b2==true
排序算法
sort
和stable_sort
;后者是稳定排序。
在使用的时候传入一个迭代器,和一个比较函数(可选)
bool comp(int a, int b) //降序
{ return a > b; }
int main()
{
vector<int> v{ 7,5,1,4,6,9,3,2,8 };
sort(v.begin(), v.end(), comp); //传入函数指针, 如果不传入,则默认升序排序
}
系统也有一些自带的比较函数,比如greater<int>()
和less<int>()
is_sorted
和上面两个函数接收同样类型的参数,只不过它返回一个bool
类型的值来说明这个序列是否是排好序的
References:
C++ algorithm算法库www.lagou.com