string
输入
迭代器
string::iterator it;
头指针:str.begin();
尾指针:str.end();
函数
| find(子串); | 查找子串第一次出现的下标,没有返回string::npos(-1) |
|---|---|
| find(子串,x); | 在下标x之后,查找子串 |
| substr(下标i,长度len); | 截取子串,当len>字符串长度时,只取剩余的 |
| substr(下标i); | 从下标i一直截取到最后 |
| erase(下标i,删除长度len); | 删除下标i开始的n个字符 |
| erase(开始下标i); | 删除下标i之后的所有字符 |
| insert(下标i,字符串s); | 在字符串下标为i的位置插入字符串s |
| replace( i,len,str ); | 从下标i开始,替换len个字符为str |
| reverse(起始地址,结束地址+1); | 倒序 |
字符类型判断
(非string函数)
isdigit(c); 判断c是否为数字
isalpha(c); 判断c是否为字母
islower(c); 判断c是否为小写
isupper(c); 判断c是否为大写
字符类型转换
(非string函数)
tolower(c); 字符转小写
toupper(c); 字符转大写
贪心
在对问题求解时,总是做出在当前看来是最好的选择
使用前提:局部最优解一定能导致全局最优解
// 渡河问题#include <bits/stdc++.h>using namespace std;int n,ans; // 每一组的最短的渡河时间int a[10000];void f(int m,int a[]){ // 贪心策略的函数int left = m;while(left > 0){if(left == 1){ans+= a[1];break;}else if(left == 2){ans+= a[2];break;}else if(left == 3){ans+= a[3] + a[2] + a[1];break;}else{// 1,2出发,1返回,最后两名出发,2返回int s1 = a[2] + a[1] + a[left] + a[2]; // a[left]没两次都是最大的时间// 1,3出发,1返回,14出发,1返回,12过河int s2 = a[left] + a[left - 1] + 2 * a[1];ans+= min(s1,s2);left-= 2;}}}int main(){int t;cin >> t;for(int i = 1;i <= t;++i){ // t组人cin >> n; // 每组的人数for(int i = 1;i <= n;++i){cin >> a[i];// 每一组每个人的渡河时间}sort(a+1,a+n+1);// 升序排序f(n,a);cout << ans;memset(a,0,sizeof(a)); // 初始化数组ans = 0;}return 0;}
// 导弹拦截#include <iostream>using namespace std;int a[1010]; // 存当前已经有的能够拦截导弹的系统数量 下标就是系统数量 元素 就是 当前系统拦截的最高高度int n;int k = 0;// 代表已经有的拦截系统的数量int main(){// 思路: 在当前拦截系统中 找高度最矮的系统来拦截导弹 如果没有能拦截的 就再开一个 如果有能拦截的 就找到// 第一个能拦截的(最矮的)系统进行拦截 把 这个系统的高度修改成当前的导弹高度// 处理导弹的时候 输入一个处理一个cin >> n;int x;// 飞来的导弹高度// int p = -1; // 假设没有找到for(int i = 1;i <= n;i ++){cin >> x;int p = -1; // 每一次都要找// 循环a数组 找for(int j = 1;j <= k; j ++){if(a[j] >= x){p = j;break;}}// 如果没有找到if(p == -1){k ++;a[k] = x; // 更新拦截系统的最高高度}else{a[p] = x; // 找到了 修改当前系统的最高高度}}cout << k << endl;return 0;}
指针
指针就是变量的地址
& 取一个地址的值 取一个值的地址
调用指针时:p是指针变量,p是指针指向的值
p++; 代表指针增加,不是指针指向的值增加
借助指针可以修改变量的值
#include<bits/stdc++.h>using namespace std;void fun(int a[],int n){for(int i = 0;i < n;i ++){cout << a[i] << " ";}cout << endl;}void fun1(int *a,int n){for(int i = 0;i < n;i ++){//cout << a[i] << " ";cout << *a << " "; // 输出下标为0的地址 存储的元素a ++; // 地址++;}cout << endl;}void fun3(char s[]){ // 传入的是字符数组for(int i = 0;i < strlen(s);i ++){cout << s[i] << " ";}cout << endl;}void fun4(char *s){ // 传入的是字符数组的地址while(*s != '\0'){ //字符数组 是以‘\0’为结尾的cout << *s << " ";s ++;}cout << endl;}int main(){int a[5] = {10,20,30,50,40};// 通过指针 输出 数组的元素 或者 字符串fun(a,5);fun1(a,5);// 字符串char s[100] = "hello";fun3(s);fun4(s);return 0;}/* 输出:10 20 30 50 4010 20 30 50 40h e l l oh e l l o*/
#include <bits/stdc++.h>using namespace std;struct st{ //定义了st结构体int num;string name;double h;};int main(){// 能定义整数指针类型 就能定义 结构体指针类型st s; // 定义 st结构体类型 变量 ss.num = 1;s.name = "xiaoming";s.h = 178.6;cout << s.num << " " << s.name << " " << s.h << endl;st *p = &s; //定义结构体指针 指向 st结构体 变量s// -> 指针->成员名 ->表示 指向cout << p->num << " " << p->name << " " << p->h << endl;// p 指针 *p 是结构体cout << (*p).num << " " << (*p).name << " " << (*p).h << endl;return 0;}/* 输出:1 xiaoming 178.61 xiaoming 178.61 xiaoming 178.6*/
