一些好用的函数(持续更新)

本文详细介绍了C++中的一些高效函数,包括next_permutation()和prev_permutation()用于全排列,lower_bound()、upper_bound()、equal_range()与binary_search()涉及二分查找,以及partial_sort()、nth_element()、stable_sort()关于排序,还有fill()、fill_n()与unique()的序列操作。这些函数在解决特定问题时具有良好的性能和便利性。
摘要由CSDN通过智能技术生成

前言:本篇主要简单记录一些平时遇到的好用的或者性能很特别的函数,持续更新中

1.关于全排列

(1)next_permutation()

头文件:

#include <algorithm>

函数原型:

bool next_permutation(iterator begin,iterator end)

用来求全排列的下一项(按字典序)

例:对于以下代码:

char ch[5]={
   'a','d','b','e','c'};
next_permutation(ch,ch+5);
cout << ch[0] << ch[1] << ch[2] << ch[3] << ch[4] << endl;

输出结果为:

adcbe

需要注意的是,这个函数返回值类型是 b o o l bool bool,当数组已经完全倒序时,函数会返回 f a l s e false false,根据这一原理,我们可以利用一个do-while循环,对一个按字典序排列好的数组进行全排列的遍历:

char ch[3]={
   'a','b','c'};
do{
   
	cout << ch[0] << ch[1] << ch[2] << endl;
}while(next_permutation(ch,ch+3));

注意这里一定要用do-while,否则不会有原先的排列顺序

输出结果为:

abc
acb
bac
bca
cab
cba

(2)prev_permutation()

头文件:

#include <algorithm>

函数原型:

bool prev_permutation(iterator begin,iterator end)

用来求全排列的上一项(按字典序)

与上面的next_permutation()类似,对于以下代码:

char ch[5]={
   'a','d','b','e','c'};
prev_permutation(ch,ch+5);
cout << ch[0] << ch[1] << ch[2] << ch[3] << ch[4] << endl;

输出结果为:

adbce

同理,当数组已经完全正序时,函数会返回 f a l s e false false,我们同样可以利用一个do-while循环,对一个完全倒序的数组进行全排列的遍历:

char ch[3]={
   'c','b','a'};
do{
   
	cout << ch[0] << ch[1] << ch[2] << endl;
}while(prev_permutation(ch,ch+3));

输出结果为:

cba
cab
bca
bac
acb
abc

2.关于二分查找

(1)lower_bound()

头文件:

#include <algorithm>

函数原型:

iterator lower_bound(iterator begin,iterator end,const T& val);

用来求单调不减序列 [ b e g i n , e n d ) [begin,end) [begin,end)中第一个数值 ≥ v a l \geq val val的迭代器,其中传入的参数 b e g i n begin begin e n d end end分别为序列开头和末尾的迭代器,特别地,如果序列中所有数值都 < v a l < val <val,则会返回数组中下标为 e n d end end的迭代器

例:对于以下代码

int a[5]={
   1,3,5,7,9};
cout << (lower_bound(a,a+5,1)-a) << " ";
cout << (lower_bound(a,a+5,2)-a) << " ";
cout << (lower_bound(a,a+3,8)-a) << " ";
cout << (lower_bound(a,a+5,10)-a) << endl;

输出结果为:

0 1 3 5

需要注意的是,这个函数内部实现利用了二分查找的原理,时间复杂度为 O ( log ⁡ n ) O(\log n) O(<

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值