带你快速理解各函数并运用(c\c++)

以下是我在日常写解题脚本常用的函数,也算是自己掌握的知识点总结

个人对它们的理解部分由部分文字说明,部分的例子和注释展示(如有错误请师傅们直接指出)

< algorithm>

常用函数有

  1. max (x, y):返回两个元素中值最大的元素

  2. min (x, y):返回两个元素中值最小的元素

  3. count (start, end, val):返回值为 在该范围内等价于val的元素的个数

  4. search (start, end, val):该范围内存在value 就返回 true,否则返回 false

  5. reverse ():倒序,123变成321

  6. swap (str1, str2):交换str1,str2的元素

  7. sort (start, end, cmp):cmp用于规定排序的方法,不填默认升序

    (平常使用更推荐)stable_sort (start, end, cmp):比sort更稳定的排序,遇到两个数相等时,不对其交换顺序,如果遇到了结构体,那么两种排序的区别就很明显

    下面是对cmp函数规则的编写

    一 . 数组的排列

int num[105];
bool cmp1(int a, int b) 
{
	return a < b;	//升序
}
bool cmp2(int a, int b) 
{
    return a > b;	//降序
}

sort(num, num+105, cmp1);	//cmp1可不填,默认升序,此处是对数组num进行升序排列

sort(num, num+105, cmp2);	//此处是对数组num进行降序排列
sort(num, num+105, greater<int>());//这也是降序排列的一种写法

二 . 结构体的排序

​ 要求:按照语文成绩从高到低排序,如果语文成绩相同,那么再按照数学成绩从高到低排序,若数学成绩也相同,按英语成绩从高到低排序

struct Student{
    int Chinese;
    int Math;
    int English;
}stu[105];

bool cmp(Student a, Student b)
{
	if(a.Chinese != b.Chinese) return a.Chinese > b.Chinese;
    if(a.Math != b.Math)  return a.Math > b.Math;
    return a.English > b.English;	//运行到这一步表示上方的条件没有被满足,语文和数学成绩相等,因此最后不需要加上判断条件
}

sort(stu, stu+105, cmp);

下方是内容的补充: **lower_bound **和 upper_bound

lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。
|
|
在从小到大的排序数组中,
… lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
… upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
|
|
在从大到小的排序数组中,重载lower_bound()和upper_bound()
… lower_bound( begin,end,num,greater() ):从数组的begin位置到end-1位置二分查找第一个小于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
… upper_bound( begin,end,num,greater() ):从数组的begin位置到end-1位置二分查找第一个小于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

上面的引用来自这位师傅的文章
https://blog.csdn.net/qq_40160605/article/details/80150252

下面是个人的举例

bool cmp(int a, int b)
{
    return a > b;	//降序
}
int num[] = {10,22,14,2,6,9,12,64,13,10,13,14};
sort(num, num+12);	//需要先将数组进行升序排序
int lb = lower_bound(num, num+12, 14) - num; //返回大于等于被查的元素位置,这个位置从0开始
int ub = upper_bound(num, num+12, 14) - num; //返回大于被查的元素位置,这个位置从0开始
cout << "(升序)大于等于14的第一个元素的位置(从0开始): " << lb << endl;
cout << "(升序)大于14的第一个元素的位置(从0开始): " << ub << endl;

sort(num, num+12, cmp);	//此处为降序排序
int lb = lower_bound(num, num+12, 14, cmp) - num;
int ub = upper_bound(num, num+12, 14, cmp) - num;
cout << "(降序)小于等于14的第一个元素的位置(从0开始): " << lb << endl;
cout << "(降序)小于14的第一个元素的位置(从0开始): " << ub << endl;

在这里插入图片描述

< cmath>

包含<math.h>的头文件,常用函数有

  1. 幂运算
   sqrt (double x)		//返回值为 x的平方根
   pow (double x, double y)	//返回值为 x 的 y 次幂(次方)
   pow (x, 1.0 / y)		//返回值为 x 的 y 次开方
  1. 绝对值
  abs(int x || long int x)	//返回int , long int 类型的绝对值,不可用于 long long
  fabs(double x)	//返回 double 类型的绝对值

< map>

map<x, y> m;

x,y可以为任何数据,x为关键字(first),y为关键字的值(second),即x的值为y

Map中的元素是自动按 key 升序排序,所以不能对map用sort函数

insert - erase- size- clear- find- count- empty- swap

//头文件	#include<map>;
map<int, int> mp, mp1;
mp.insert(pair<int ,int>(200,100)); 	//insert(): 插入值,即增加元素
mp.insert(pair<int ,int>(300,150));
mp.insert(pair<int ,int>(100,200));
map<int, int>::iterator it;	 // 定义 it 为map的迭代器
for(it = mp.begin(); it != mp.end(); it++) // 遍历mp且按照关键词升序
    cout << it->first << " - " << if->second << endl; 
    
mp.erase(200);					//erase(): 删除关键字为200的元素
cout << mp.size() << endl;		//size(): 查看mp的元素个数
mp.clear(); 					//clear(): 清空元素

it = student.find(123);    		//find():查找元素,如果找不到,则返回map::end()位置
if(it != student.end())		
    cout << "found it";
else
    cout << "no found";

if(mp.count(1) == 1)	  //count(): 找到返回1,否则返回0,功能与上方find()相同
    cout << "found it";
else
    cout << "no found";	  //empty(): 如果map容器为空,返回True,否则返回False

 mp.swap(mp1); 			// swap(): 将两个map的元素互换

< cstring>

需要同时存在 < string >库,

读入

string str;
cin >> s;	//遇到空格,制表符('\t'),回车符为结束符
getline(cin, str);	//可读取空格和制表符,以回车符为结束符
  1. strcpy(str1, str2):将str2 里的字符串复制粘贴到 str1 里面

    srtncpy(str1, str2, n): 把str2 的字符串复制到 str1里,最多复制n位,如果str2 的长度小于 n时,str1 的剩余部分将用空字节填充

  2. strcat(str1, str2): 把str2 拼接到 str1 后面

    strncat(str1, str2, n): 把 str2 的 n 位字符串拼接到 str1 后面

    string str1 = "abc", str2 = "123", str3;
    str3 = strcat(str1, str2);
    //str3 = abc123;
    
  3. strlen(str):返回字符串str 的长度

  4. strcmp(str1, str2):通过ACSII码的值进行两个字符串间大小的比较,用str1 的第一个字符减去 str2 的第一个字符,如果差值为0就继续向下比较,如果差值不为0,返回差值

    strncmp(str1, str2, n):比较 n 位字符

    如果返回值小于 0,则表示 str1 小于 str2

    如果返回值大于 0,则表示 str1 大于 str2

    如果返回值等于 0,则表示 str1 等于 str2

  5. strchr (str, c):返回字符串 str 中第一次出现字符 c 的位置,如果未找到该字符则返回 NULL

    strrchr (str, c):返回字符串 str 中最后一次出现字符 c 的位置,如果未找到该字符则返回 NULL

  6. memset (str, c, n): 复制字符 c 到str 的前 n位字符,也可以像下方使整形数组全为一个值

    int num[105];
    memset(num, -1, sizeof(num));	//此刻数组 num中的全部被赋值为-1
    
  7. strstr (str1, str2):寻找str2 在 str1 首次出现的位置

char *str1 = "Godisagirl";	//char str1[] = ""的格式也可以
char *str2 = "sa";			//同上
char *result;				//result为指针,不能变动
	
result = strstr(str1,str2); //此刻result指向的是s的地址
printf("取得后面的字符串: %s\n",result);	//输出从s地址向后的内容
printf("str2首次出现的位置:%d\n",result-str1+1);	//str1指向G,所以结果输出第一次出现的位置

在这里插入图片描述

更多的情况是str2 多次出现在 str1中

例如:

	char *str1 = "鳖载着理发店,鸠载着理发店啊";
	char *str2 = "发店";
	char *tmp;
	int time = 0;
	tmp = str1;
	
	while((tmp = strstr(tmp,str2)) != NULL)	//此处的strstr内如果用的是str1的话会因为恒满足条件
	{									 //而无法跳出循环,所以要用变化的tmp逐步缩小范围
		time++;
		cout << tmp << endl;
		tmp++;	//自加,指针指向下一个地址,即发店的 店 这个位置
	}
	cout << "重复出现的次数: " << time << endl;

在这里插入图片描述

较为详细的视频介绍:06_strstr字符串查找函数

未完待续,之后会继续学习不断更新ing

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值