以下是我在日常写解题脚本常用的函数,也算是自己掌握的知识点总结
个人对它们的理解部分由部分文字说明,部分的例子和注释展示(如有错误请师傅们直接指出)
< algorithm>
常用函数有
-
max (x, y):返回两个元素中值最大的元素
-
min (x, y):返回两个元素中值最小的元素
-
count (start, end, val):返回值为 在该范围内等价于val的元素的个数
-
search (start, end, val):该范围内存在value 就返回 true,否则返回 false
-
reverse ():倒序,123变成321
-
swap (str1, str2):交换str1,str2的元素
-
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>的头文件,常用函数有
- 幂运算
sqrt (double x) //返回值为 x的平方根
pow (double x, double y) //返回值为 x 的 y 次幂(次方)
pow (x, 1.0 / y) //返回值为 x 的 y 次开方
- 绝对值
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); //可读取空格和制表符,以回车符为结束符
-
strcpy(str1, str2):将str2 里的字符串复制粘贴到 str1 里面
srtncpy(str1, str2, n): 把str2 的字符串复制到 str1里,最多复制n位,如果str2 的长度小于 n时,str1 的剩余部分将用空字节填充
-
strcat(str1, str2): 把str2 拼接到 str1 后面
strncat(str1, str2, n): 把 str2 的 n 位字符串拼接到 str1 后面
string str1 = "abc", str2 = "123", str3; str3 = strcat(str1, str2); //str3 = abc123;
-
strlen(str):返回字符串str 的长度
-
strcmp(str1, str2):通过ACSII码的值进行两个字符串间大小的比较,用str1 的第一个字符减去 str2 的第一个字符,如果差值为0就继续向下比较,如果差值不为0,返回差值
strncmp(str1, str2, n):比较 n 位字符
如果返回值小于 0,则表示 str1 小于 str2
如果返回值大于 0,则表示 str1 大于 str2
如果返回值等于 0,则表示 str1 等于 str2
-
strchr (str, c):返回字符串 str 中第一次出现字符 c 的位置,如果未找到该字符则返回 NULL
strrchr (str, c):返回字符串 str 中最后一次出现字符 c 的位置,如果未找到该字符则返回 NULL
-
memset (str, c, n): 复制字符 c 到str 的前 n位字符,也可以像下方使整形数组全为一个值
int num[105]; memset(num, -1, sizeof(num)); //此刻数组 num中的全部被赋值为-1
-
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