常用函数
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
一、查找
1、二分查找binary_search()
- 只能对数组进行查找
sort
排序后在使用binary-search
查找函数
std::binary-search
函数定义在algorithm头
文件中,用于在已排序的数组或容器如vector
中查找特定元素,通过二分查找来确定序列中是否存在目标元素,返回bool
型,时间复杂度O(longn)
bool binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __val, _Compare __comp)
返回值:bool
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
vector<int> v= {1,5,4,3,8,-50};
sort(v.begin(),v.end());
if(binary_search(v.begin(),v.end(),4)) {
cout<<"find"<<endl;
}
return 0;
}
2、lower_bound()函数和upper_bound()函数
二者都是利用二分查找的方法在一个排序好的数组中进行查找
在从小到大的排序中:
lower_bound(begin,end,val)
:从数组的begin
位置到end-1
位置二分查找第一个大于或等于val
的数组,找到返回该数字的地址,不存在则返回end,通过该返回的地址减去其实地址begin,得到该数字在数组中的下标。
upper_bound(begin,end,val)
:从数组的begin
位置到end-1
位置二分查找第一个大于val
的数组,找到返回该数字的地址,不存在则返回end,通过该返回的地址减去其实地址begin,得到该数字在数组中的下标。
在从大到小的排序中:
lower_bound(begin,end,val)
:从数组的begin
位置到end-1
位置二分查找第一个小于或等于val
的数组,找到返回该数字的地址,不存在则返回end,通过该返回的地址减去其实地址begin,得到该数字在数组中的下标。
upper_bound(begin,end,val)
:从数组的begin
位置到end-1
位置二分查找第一个小于val
的数组,找到返回该数字的地址,不存在则返回end
,通过该返回的地址减去其实地址begin
,得到该数字在数组中的下标。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
vector<int> v2= {2,6,-4,2,90};
sort(v2.begin(),v2.end()); //{-4,2,2,6,90}
int pos1=lower_bound(v2.begin(),v2.end(),2)-v2.begin();
int pos2=upper_bound(v2.begin(),v2.end(),2)-v2.begin();
cout<<pos1<<" "<<v2[pos1]<<endl;//1 2
cout<<pos2<<" "<<v2[pos2]<<endl;//3 6
return 0;
}
3、最值查找 min_element()、max_element()
std::min_element
和std::max_element
是 C++ 标准库中的两个算法函数,用于在容器中查找最小值和最大值对应的迭代器。它们在 <algorithm>
头文件中声明。时间复杂度为 O(n)
。
注意它返回的是迭代器,同begin(),end()
std::min_element(first, last)
std::max_element(first, last)
first 和last:表示要查找的范围的起始和结束迭代器(包含 first,但不包含 last)。[first, last)
4、nth_element()函数
std::nth_element
是 C++ 标准库中的一个算法函数,用于对容器中的元素进行部分排序,使得指定位置的元素处于排序后的正确位置。它在 <algorithm>
头文件中声明。
inline void nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth,_RandomAccessIterator __last, _Compare __comp)
std::nth_element 函数对范围 [first, last) 中的元素进行部分排序,使得迭代器 nth 指向的元素处于排序后的正确位置。
换句话说,nth 之前的元素都不大于 nth位置的元素,nth 之后的元素都不小于 nth 位置的元素。但是,nth 位置的元素不一定是整个范围中的第 nth 小的元素。
二、排序
1、sort()函数
std::sort
是 C++ 标准库中的一个算法函数,用于对容器中的元素进行排序。它在<algorithm>
头文件中声明。
first
和 last
:表示要排序的范围的起始和结束迭代器(包含 first,但不包含 last)。
std::sort
函数对范围 [first, last) 中的元素执行排序操作。默认情况下,它使用 < 运算符来比较元素的大小。如果需要自定义排序规则,可以提供一个比较函数或者 lambda 函数作为额外参数。
void sort(_RandomAccessIterator __first, _RandomAccessIterator __last,_Compare __comp)
三、全排列
1、next_permutation()函数
std::next_permutation
是 C++ 标准库中的一个算法函数,用于生成给定序列的下一个排列。它在<algorithm>
头文件中声明。
bool next_permutation(_BidirectionalIterator __first,_BidirectionalIterator __last, _Compare __comp)
返回值:bool类型
first 和 last:表示要处理的范围的起始和结束迭代器(包含 first,但不包含 last)。
std::next_permutation 函数会重新排列范围 [first, last) 中的元素,生成当前排列的下一个排列。如果存在下一个排列,则函数返回 true,否则返回 false。如果 first 和 last 之间的元素已经按字典序降序排列(即当前排列是最后一个排列),那么函数将重新排列这些元素为第一个排列,并返回 false。
在这里插入代码片
2、pre_premutation()函数
std::prev_permutation
是 C++ 标准库中的一个算法函数,用于生成给定序列的上一个排列。它在<algorithm>
头文件中声明。
bool prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
返回值:bool类型
first 和 last:表示要处理的范围的起始和结束迭代器(包含 first,但不包含 last)。
std::prev_permutation 函数会重新排列范围 [first, last) 中的元素,生成当前排列的上一个排列。如果存在上一个排列,则函数返回 true,否则返回 false。如果 first 和 last 之间的元素已经按字典序升序排列(即当前排列是第一个排列),那么函数将重新排列这些元素为最后一个排列,并返回 false。
四 大小写函数
1、判断大小写函数islower(),isupper()
islower() 和 isupper() 是 C++ 标准库中的字符处理函数,用于检查字符是否为小写字母和大写字母。它在<cctype>
头文件中声明。
int islower(int c);
c:表示要检查的字符,通常以整数形式传入。
islower 函数用于检查字符 c是否为小写字母。如果 c 是小写字母,则返回非零值(通常为 1),否则返回 0。
int isupper(int c);
c:表示要检查的字符,通常以整数形式传入。
isupper 函数用于检查字符 c是否为大写字母。如果 c 是大写字母,则返回非零值(通常为 1),否则返回 0。
2、大小写转换函数 tolower(),toupper()
tolower()
和 toupper()
是 C++ 标准库中的字符处理函数,用于将字符转换为小写和大写形式。它在 <cctype>
头文件中声明。
int tolower(int c);
c:表示要转换的字符,通常以整数形式传入。
tolower 函数用于将字符 c 转换为小写形式。如果c 是大写字母,则返回相应的小写字母;否则,返回 c 自身。
int toupper(int c);
c:表示要转换的字符,通常以整数形式传入。
toupper 函数用于将字符 c 转换为大写形式。如果 c是小写字母,则返回相应的大写字母;否则,返回 c 自身。
五
1、memset() 函数
memset 是 C/C++ 标准库中的一个函数,用于将一段内存区域的内容设置为指定的值。它在 头文件中声明。
memset 函数将指针 ptr 开始的连续 num 个字节的内存内容都设置为 value。
void* memset(void* ptr, int value, size_t num);
ptr:表示指向要填充的内存区域的指针。
value:表示要设置的值,以整数形式传入。
num:表示要设置的字节数。
2、swap()函数
std::swap()
是 C++ 标准库中的一个函数模板,用于交换两个值。它在 <algorithm>
头文件中声明。
std::swap()
函数用于交换 a 和 b 两个值。它可以用于任何数据类型,包括基本数据类型(如整数、浮点数)和自定义类型(如类对象)。
3、reverse 函数
std::reverse
是 C++ 标准库中的一个算法函数,用于反转容器中元素的顺序。它在 <algorithm>
头文件中声明。
void reverse(BidirectionalIterator first, BidirectionalIterator last);
first 和 last:表示要反转的范围的起始和结束迭代器(包含 first,但不包含 last)。
std::reverse 函数用于反转范围 [first, last) 中的元素的顺序。它逆序地重新排列容器中的元素,即将第一个元素与最后一个元素交换,第二个元素与倒数第二个元素交换,以此类推,直到中间位置。
4、unique 函数
std::unique
是 C++ 标准库中的一个算法函数,用于移除容器中相邻重复的元素,并返回指向新的逻辑结尾的迭代器。它在 <algorithm>
头文件中声明。
ForwardIterator unique(ForwardIterator first, ForwardIterator last);
first 和 last:表示要处理的范围的起始和结束迭代器(包含 first,但不包含 last)。
std::unique 函数用于移除范围 [first, last) 中相邻重复的元素,只保留每个不重复元素的第一个出现,并返回一个指向新的逻辑结尾的迭代器,指向不重复元素的下一个位置。但是注意这里并没有删除元素,只是把元素移到了末尾。
sort()
排序后,使用unique()
获取去重以后vector中没有重复元素的下一个位置的迭代器pos
。使用erase()
擦除无意义的部分,或直接输出v.begin(),pos
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
vector<int> v= {1,5,6,6,12,2,2,5};
sort(v.begin(),v.end());
auto pos=unique(v.begin(),v.end());//1 2 5 6 12 6 6 12
for(auto i=v.begin();i<pos;i++){
cout<<*i<<" "; //1 2 5 6 12
}
return 0;
}
总结
提示:这里对文章进行总结: