c++常用库函数(超级详细版)

这篇具有很好参考价值的文章主要介绍了c++常用库函数(超级详细版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

c++常用库函数

1 min/max

min函数用于比较得到较小数

max函数用于比较得到较大数

int a=1,b=2;
string s1 = "wang";
string s2 = "ming";
cout<<min(a,b)<<endl;
cout<<max(a,b)<<endl;
cout<<min(s1,s2)<<endl;
cout<<max(s1,s2)<<endl;
//输出结果
// 1
// 2
// ming
// kang

2 sort 排序

Algorithm中的排序函数是基于快速排序算法实现的,时间复杂度为O(N*logN)

基本思想:通过一趟排序将待排序的数据分割成独立的两部分,左边部分的所有数据比右边部分的所有数据都要,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,最后达到整个数据变成有序序列。

1 sort构成

    sort(数组首指针,数组尾指针,排序规则);
    前两个位置都是填指针
    第三个位置可以不填,不填默认按由大到小排序

2 sort默认由小到大进行排序

int arr[4]={1,3,2,4};
sort(arr,arr+4);
//排序结果是 1,2,3,4

3 自定义排序规则

//通过自定义规则进行排序
bool map(int x1,int x2){
    return x1>x2;
}
int arr[5]={3,2,1,4,5};
sort(arr,arr+n,map);
//排序结果是 5,4,3,2,1
//规则的位置不仅可重载大小于号,还可以重载其他符号

3 二分查找

二分查找算法也称折半查找算法Binary Search Algorithm,它是一种效率较高的查找方法,复杂度为O(log**N)。二分查找算法要求线性表(序列)必须采用顺序存储结构,而且表中元素按关键字有序排列。

核心思想:将表中间位置记录的关键字与待查找的关键字进行比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

1 binary_search

int arr[4] = {1,2,3,4}; // 升序数组
bool judge1 = binary_search(arr, arr+4, 1); // judge1结果为true
bool judge2 = binary_search(arr, arr+4, 5); // judge2结果为false
//binary_search利用的也是指针

2 lower_bound

在有序序列里查找不小于关键字的元素,并返回元素索引位置最低的地址,最后根据地址来判断是否查找成功

模板函数lower_bound的基本用途是查找有序区间中第一个大于或等于某给定值的元素的位置

通常最后利用减去数组首地址得到一个数组下标

例:

int arr[5] = {1,2,4,5,6};
int c = lower_bound(arr,arr+5,4)-arr;
// c的值就是2

3 upper_bound

模板函数upper_bound的基本用途与lower_bound相对,是查找有序区间中第一个大于某给定值的元素的位置,由此本关卡的任务可以利用upper_bound获取序列中第一个大于待查找关键字的元素的位置

int arr[5] = {1,2,4,5,6};
int c = upper_bound(arr,arr+5,4)-arr;
// c 的值是 3 

4 equal_range

模板函数equal_range综合了lower_boundupper_bound的功能,通过内部调用这两个上下界查找函数,返回两个地址并组成pair:第一个地址是序列中第一个大于等于待查找关键字的元素位置,而第二个地址是第一个大于待查找关键字的元素位置。

int arr[5] = {1,2,2,4,5};
auto bounds = equal_range(arr, arr+5, 2);//auto是自动判断定义类型
int a = bounds.first-arr; // a结果为1
int b = bounds.second-arr; // b结果为3

4 copy 复制

1 copy

复制整个数组到新的数组中

int arr1[4] = {1,3,2,4};
int arr2[4];
copy(arr1, arr1+4, arr2);

2 copy_n

是可选择的复制前n个元素到新的数组

int arr1[4] = {1,3,2,4};
int arr2[4];
copy_n(arr1, 4, arr2);

5 swap 交换

int a = 1,b = 2;
swap(a,b);
//此时  a = 2, b = 1

6 replace 取代

Algorithm中取代模板函数为replace,传入参数first为数组首地址,参数last为数组尾地址,要被替换的旧元素为参数old_value,替换的新的元素为参数new_value,函数功能是将数组中所有的old_value替换为new_value,其函数原型及其应用实例如下:

int arr[4] = {1,2,2,3};
replace(arr, arr+4, 2, 0);
// arr结果为{1,0,0,3}

7 fill 填充

Algorithm中填充模板函数为fill,传入参数first为数组首地址,参数last为数组尾地址,填充值为参数val,函数功能是将数组中的所有元素都重新赋值为val

int arr[4] = {1,2,2,3};
fill(arr, arr+4, 5);
// arr结果为{5,5,5,5}

特别的,类似的填充函数还有memset,在头文件string.h中,但是赋值有限,一般仅限于-10,若设置为其他数值,则实际结果有误。

8 reverse 翻转 倒置

Algorithm中倒置模板函数为reverse,传入参数first为数组首地址,参数last为数组尾地址,函数功能是将数组中的所有元素对称交换,例如比如1 2 3,变为3 2 1,其函数原型及其应用实例如下:

int arr[4] = {1,2,3,4};
reverse(arr, arr+4);
// arr结果为{4,3,2,1}

9 rotate 滚动

Algorithm中滚动模板函数为rotate,传入参数first为数组首地址,参数last为数组尾地址,而参数middle则是数组中要滚动的最后一个元素的后一个地址,滚动完成后该地址将成为首地址,比如数组arr=[0,1,2,3,4],相应的参数为first=arrlast=arr+5middle=arr+3,则滚动后的结果为3 4 0 1 2,其函数原型及其应用实例如下:

int arr[5] = {0,1,2,3,4};
rotate(arr, arr+3, arr+5);
\\ arr结果为{3,4,0,1,2}

10 无序查找

1 无序数组查找指定元素 Find

二分查找binary_search不一样,Algorithm中的模板函数find可以在无序数组中的查找指定元素x,若存在则返回第一个x所在的地址,否则返回数组尾地址,其函数原型及其应用实例如下,其中传入参数first为数组首地址,参数last为数组尾地址,待查找指定元素为参数val

int arr[4] = {1,3,2,3};
int *p = find(arr, arr+4, 3); // p结果为地址arr+1
int *q = find(arr, arr+4, 0); // q结果为地址arr+4

2 无序数组查找指定数组子序列 Find_End

Algorithm中的模板函数find_end可以在无序数组arr1中的查找指定子数组arr2是否存在,若存在则返回待查子数组arr2最后出现在原数组arr1的地址,否则返回原数组的尾地址,例如arr1=[0,3,4,3,4]arr2=[3,4],返回结果为arr1+3,其函数原型及其应用实例如下:

int arr[5] = {0,3,4,3,4};
int arr1[2] = {3,4};
int arr2[2] = {3,5};
int *p = find_end(arr, arr+5, arr1, arr1+2); // p结果为地址arr+3
int *q = find_end(arr, arr+5, arr2, arr2+2); // q结果为地址arr+5

特别的,如想要第一次出现的地址,模板函数search 可以实现这一功能,使用方式同上

11 count 统计

Algorithm中的模板函数count可以在数组中统计指定元素x出现的次数,传入参数first为数组首地址,参数last为数组尾地址,参数x为待统计的指定元素,其函数原型及其应用实例如下:

int arr[5] = {0,3,4,3,4};
int cnt = count(arr, arr+5,3); // cnt结果为2

12 比较 Equal

两个数组相等意思是数组个数相同,对应位置上的元素值也相同,Algorithm中的模板函数equal就可以比较两个数组是否相等,返回比较真值,

int arr1[2] = {3,4};
int arr2[2] = {3,4};
int arr3[2] = {3,5};
bool judge1 = equal(arr1, arr1+2, arr2); // judge1结果为地址true
bool judge2 = equal(arr1, arr1+2, arr3); // judge2结果为地址false

13 merge 合并

合并函数的核心思想是设置两个头指针,分别指向两个升序数组首地址,通过比较两个头指针的大小,每次都将小的数值放入新的数组,然后小数值指针后移,最后新的数组也是有序的,从而完成合并过程,复杂度为O(N+M)。

int arr1[3] = {1,2,3};
int arr2[4] = {2,3,4,5};
int arr3[7];
merge(arr1, arr1+n1, arr2, arr2+n2, arr3);
// arr3结果为{1,2,2,3,3,4,5}

14 includes 包含

无序数组的包含问题就像是字符串应用中的最长公共子序列,解法是动态规划,而有序数组的包含则是简单的判断问题,解法类似有序数组的合并。

同样的,其核心思想也是设置两个头指针分别指向两个升序数组,若指针指向的元素相等,则两个指针都往后移动,否则指向数组arr1的指针往后移动,直到指针移向数组尾地址。

int arr1[4] = {1,2,3,4};
int arr2[2] = {2,3};
bool judge(arr1, arr1+4, arr2, arr2+2);
// judge结果为true

15 集合相关函数

集合是由一个或多个确定的元素所构成的整体。集合中的元素有三个特征:

  • 确定性(集合中的元素是确定的);
  • 互异性(集合中的元素是互不相同),例如:集合A=(1,a),则a不能等于1;
  • 无序性:集合中的元素没有先后之分,如集合(3,4,5)和(3,5,4)算作同一个集合,

1 set_union 集合的并

集合A和集合B的并是由所有属于集合A或属于集合B的元素所组成的集合,记作AB 或者BA,并集的一个重要属性就是越并越多。假定集合A=(1,2,3,4,5,6,7),集合B=(6,7,8,9),那么集合A和集合B的并集为AB=(1,2,3,4,5,6,7,8,9)。

Algorithm算法模板中集成了集合的并操作,函数名称为set_union,其作用是将两个集合合并成一个集合,但是要求输入的两个集合必须是有序的,这看似违背了集合的定义,但是有序的目的是为了让求并的过程实现起来变得简单。

int arr1[3]={1,2,3};
int arr2[3]={2,3,4};
int arr3[4];
int n = set_union(arr1, arr1+n1, arr2, arr2+n2, arr3)-arr3;
// arr3结果为{1,2,3,4}
// n结果为4

2 集合的交 set_intersection

集合AB的交是由所有属于集合A以及属于集合B的元素所组成的集合,记作AB或者BA,交集的一个重要属性就是越交越少。假定集合A=(1,2,3,4,5,6,7),集合B=(6,7,8,9),那么集合A和集合B的交集为AB=(6,7)。

Algorithm算法模板中集成了集合的交操作,函数名称为set_intersection,其作用是将两个集合交成一个集合,同样的要求输入的两个集合必须是有序的。因此,首先需要将两个集合排序,然后才调用set_intersection函数计算出交集。其函数原型及应用实例如下,输入参数是两个集合的首尾地址以及一个保存交集结果的数组的首地址,最后返回数组尾地址:

int arr1[3]={1,2,3};
int arr2[3]={2,3,4};
int arr3[2];
int n = set_intersection(arr1, arr1+n1, arr2, arr2+n2, arr3)-arr3;
// arr3结果为{2,3}
// n结果为2

3 集合相对差集 set_difference

集合差集也叫集合补集,是一个相对的定义:由属于A而不属于B的元素组成的集合,称为B关于A的相对补集,记作AB。例如集合A=(1,2,3,4),集合B=(3,4,5,6),那么集合AB=(1,2)。

Algorithm算法模板中集成了集合的差操作,函数名称为set_difference,其作用是计算出两个集合的差集,

int arr1[4]={1,2,3,4};
int arr2[4]={3,4,5,6};
int arr3[4];
int n = set_difference(arr1, arr1+n1, arr2, arr2+n2, arr3)-arr3;
// arr3结果为{1,2}
// n结果为2

4 集合对称差集

集合A与集合B的对称差集定义为属于集合A与集合B,但不属于它们交集AB的元素集合,记为AB。也就是说AB=xxABx∈/AB,即AB=(AB)—(AB)。同样也可以用相对差集的并来表示AB=(AB)∪(BA)。例如上述的两个集合,他们的对称差集为AB=(1,2,5,6)。

Algorithm算法模板中集成了集合对称差集的操作,函数名称为set_symmetric_difference,其作用是计算出两个集合的对称差集,同样的,要求输入的两个集合必须是有序的。

int arr1[4]={1,2,3,4};
int arr2[4]={3,4,5,6};
int arr3[8];
int n = set_symmetric_difference(arr1, arr1+n1, arr2, arr2+n2, arr3)-arr3;
// arr3结果为{1,2,5,6}
// n结果为4

14 字典序函数

1 序列排列

一般地,从n个不同元素中取出m个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列permutation。特别地,当m=n时,这个排列被称作全排列all permutation,本关卡就是关于n的全排列问题。

2 顺序 next_permutation

给定一个排列序列,Algorithm中的模板函数next_permutation可以产生该排列的下一个序列,输入参数为序列的首地址和尾地址,

do{
       for(int i=0;i<n;i++)cout<<arr[i]<<' ';
       next_permutation(arr,arr+n);
       i++;
   }while(i<m);

3 逆序 prev_permutation

给定一个排列序列,Algorithm中的模板函数prev_permutation可以产生该排列的上一个序列,输入参数为序列的首地址和尾地址,文章来源地址https://www.toymoban.com/news/detail-758675.html

do{
       for(int i=0;i<n;i++)cout<<arr[i]<<' ';
       prev_permutation(arr,arr+n);
       i++;
   }while(i<m);

到了这里,关于c++常用库函数(超级详细版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于C语言的数据结构之顺序表——带你熟练掌握顺序表基本操作!!超级详细!!

    目录 前言: 1.源代码如下 2.数据结构——顺序表    2.1.顺序表的特点    2.2顺序表的分类     2.2.1.动态分配内存的顺序表     2.2.2.静态分配内存的顺序表    2.3.定义一个顺序表 3.顺序表的基本操作    3.1初始化顺序表     不用将顺序表中可能存在的原有元素初始化吗?

    2024年04月26日
    浏览(41)
  • c++排序算法——冒泡排序(不会的一定要看,超级详细)

    今天,我们来学习一种排序算法—— 冒泡排序 。 首先,先问三个问题: 想象一下,如果字典不是按照字母顺序排列,查找一个单词,你得查到什么时候?这就是为什么人们引入了分类的概念,因为其 极大地帮助我们快速搜索物品 。 或者说,排序是一种常用的整理信息的方

    2024年02月16日
    浏览(45)
  • 【C++】数据结构与算法:常用排序算法

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍常用排序算法。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 排序算法是计算机科学中常见的一类算法,用于将一组数据按照特定的顺序进行排

    2024年02月14日
    浏览(49)
  • C++ 算法基础(1)——cmath常用函数

    头文件声明了一组用于计算常见数学运算和转换的函数: cos(x):计算余弦。 返回x弧度角的余弦值。 The cosine of 60.000000 degrees is 0.500000. sin(x):计算正弦。 返回x弧度角的正弦值。 The sine of 30.000000 degrees is 0.500000. tan(x):计算正切。 返回x弧度角的正切值。 The tangent of 45.000000 de

    2024年02月08日
    浏览(37)
  • C++ system()函数的常用用法 (史上最详细)

    目录 一.推荐:     1. system(\\\"pause\\\")     2. system(\\\"color *\\\")     3.system(\\\"title *\\\")     4. system(\\\"cls\\\") 二.文件操作:     1. system(\\\"start *\\\")     2. system(\\\"del *\\\")     3. system(\\\"copy A B\\\")     4. system(\\\"move A B\\\") 三.系统操作     1. 关机,重启,睡眠     2. 日期/时间     3. task     1. system(\\\"pause\\\"

    2024年02月12日
    浏览(45)
  • 软件开发中常用数据结构介绍:C语言队列

    工作之余来写写C语言相关知识,以免忘记。今天就来聊聊 C语言实现循环队列 ,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦 点赞收藏评论+关注 走一波!感谢各位的

    2024年02月11日
    浏览(48)
  • 《数据结构、算法与应用C++语言描述》-列车车厢重排问题

    完整可编译运行代码见:Github::Data-Structures-Algorithms-and-Applications/_10Train_carriages_rearrangement/ 一列货运列车有 n 节车厢,每节车厢要停靠在不同的车站。假设 n个车站从 1 到n 编号,而且货运列车按照从n到1的顺序经过车站。车厢的编号与它们要停靠的车站编号相同。为了便于从

    2024年04月10日
    浏览(67)
  • 【网络安全】数据加密标准(DES算法)详细介绍( 分组密码、Feistel密码结构、轮函数、子密钥生成算法)

    将被加密明文划分成一个一个的分组,输入n比特明文分组,输出n比特密文分组。 若映射可逆,具有 x n ! x^n! x n ! 种替换可能性。 如以下示例,每个4比特输入唯一映射为另一个4比特输出。 2.1 什么是Feistel密码结构 1973年由 IBM的Horst Feistel首次提出 ,通过将明文分组分成 左右

    2023年04月08日
    浏览(43)
  • c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))

    上篇文章介绍了一些常用的字符串函数,大家可以跳转过去浏览一下:c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(上))_总之就是非常唔姆的博客-CSDN博客 今天接着来介绍一些:  目录 一.字符串查找 1.strstr() 1.1示例 1.2注意事项: 1.3模拟实现  2.

    2024年02月07日
    浏览(45)
  • 数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。

    最短路径的算法有两个, Dijkstra算法 和 Floyd算法 。 Dijkstra算法 解决的是 单源 最短路径问题 。 Floyd算法解决的是 多源 最短路径问题,并且可以处理负权图 。 今天要讲的就是Dijkstra算法。 加: feng--Insist (大写的i),进java交流群讨论互联网+技术。可索要PPT等资料。 其他资料

    2024年02月11日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包