常见函数及语法
列举一些个人认为比较实用的函数以及语法知识。
函数
二分查找函数
lower_bound
找到有序数组中第一个大于等于目标值的数的位置。如果找不到,返回最后一个值的后一个位置。如果是数组,使用格式如下:
int p = lower_bound(a+1, a+1+n, k) - a;
上述代码的含义是,在长度为 n ,下标从 1 开始的 a 数组中,找到第一个大于等于 k 的位置。如果数组中没有合法数字,会返回 n+1。
在 vector 里面使用:int p = lower_bound(a.begin(), a.end(), m) - a.begin();
在 set 里面使用:set<int>::iterator it=a.lower_bound(m)
。由于 set 不支持随机访问,所以只能返回迭代器,如果找不会返回 a.end()
,找到了若想使用数字,要用 *it
。
upper_bound
找到第一个大于元素的位置,格式同 lower_bound。
排列/排序相关
sort
默认从小到大排序,但是不稳定,需要注意,经常使用。
next_permutation
返回当前排列的下一个排列,一般在枚举全排列时使用,在使用前需要进行从小到大排序。
格式:
do{ }while(next_permutation(a+1, a+1+n));
nth_element
使用格式:nth_element(a+l,a+k,a+r)
.
将区间 中的第 大元素放在第 个位置上,左边都比这个位置上的数下,右边都比这个位置上的数字大,时间复杂度 。
如果不是为了卡常,写个 memcpy+sort 就可以过了。。。
mem家族
memset
数组赋值函数,一般这样使用:
memset(a,0,sizeof(a));
表示将 a 数组全部赋上 0 的值,但是要注意,只有赋 0 和 -1 才能真正赋值到 0 或 -1,赋值别的数是不能实现真正的区间赋值的。
在初始化 数组时也常这样使用:
memset(dp, 0x3f, sizeof(dp)); memset(dp, -0x3f, sizeof(dp));
赋值 0x3f
的好处是:两个 0x3f
加起来也不会整形溢出,而且大约在 以上,可以满足绝大多数 题目的要求。
memcpy
使用格式,memcpy(b,a,sizeof(a))
.
表示将 a 数组的值复制到 b 数组,这里要注意,a 和 b 数组必须是同一维的。
常用于滚动数组优化空间。
语法
友元
在写结构体的时候,若想重载某个运算符,用传统写法很不直观。“友元”这个概念可以帮助我们写出直观的重载运算符。
friend node operator + (node a, node b) { }
上面的例子是:重载结构体 node 的 + 运算符,最终返回一个 node 类型的值。
友元可以用作写大整数类,将高精度计算封装成正常的加减乘除运算。
也可以实现复杂状态下的 数组合并,使得代码写起来更加直观好懂。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效