sort算法排序 std_算法集成 — algorithm

通过#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

计算两个迭代器之间的距离,可用于vectormultiset等容器的迭代器

vector<int> a {1, 2, 3};
int b = distance(a.begin(), end(a));  // 3

数组填充fillfill_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

排序算法

sortstable_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
0262887136371529d326039ff3b30506.png
C++ <Algorithm>小小总结 - 简志睿 - 博客园​www.cnblogs.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值