string 头文件
str1.find(s) 查找字串
#include<cctype> //头文件
//判断相等
str1.find(s) != string::npos
//判断不等
str1.find(s) == string::npos
string::npos参数 —— npos 是一个常数,用来表示不存在的位置
str.erase()删除
(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
str.erase(3,2);
(2)erase(position);删除position处的一个字符
it = str.begin()+3;
str.erase(it);
(3)erase(first,last);删除从first到last之间的字符
str.erase(str.begin+3,str.begin+5);
s.substr(size_type pos = 0, size_type count = npos)截取子串
a = c.substr(0,i);
b = c.substr(i+1,c.size()-i-1);
stoi()与to_string()
stoi(str,pos起始位置,r进制)将r进制s转成10进制的数字
PS:stoi()函数如果传入的字符串s中含有不是数字的字符,则只会识别到从开头到第一个非法字符之前,如果第一个字符就是非法字符则会报错
to_string(number)将数字转化为字符串
#include<iostream>
#include<string>
using namespace std;
int main() {
string str = "1010";
int a = stoi(str);//默认是10进制,将1010转化为10进制数值
int b = stoi(str, 0,2);//将2进制的1010转换成10进制
cout <<"(10进制的字符串1010转化为十进制数值):\n" <<a << endl;
cout <<"(2进制的1010转换成10进制):\n" <<b << endl;
return 0;
}
(10进制的字符串1200转化为十进制数值):
1010
(2进制的1010转换成10进制):
10
string字符串拼接
- append()
append函数常用的三个功能:
直接添加另一个完整的字符串:如str1.append(str2);
添加另一个字符串的某一段子串:如str1.append(str2, pos, len);pos起始位置,len添加字符串长度
添加几个相同的字符:如str1.append(5, ‘a’);注意,个数在前;字符在后;在str1后面添加5个"a"
- push_back()
功能:将字符添加到字符串的末尾
PS:只能是字符而不是字符串
s .push_back('a');
s .push_back("abc");//错误
- +=
cctype包含的其他部分的函数
1. isalnum() 如果参数是字母数字,即字母或数字,该函数返回true
2. isalpha() 如果参数是字母,该函数返回真
3. isblank() 如果参数是空格或水平制表符,该函数返回true
4. iscntrl() 如果参数是控制字符,该函数返回true
5. isdigit() 如果参数是数字(0~9),该函数返回true
6. isgraph() 如果参数是除空格之外的打印字符,该函数返回true
7. islower() 如果参数是小写字母,该函数返回true
8. isprint() 如果参数是打印字符(包括空格),该函数返回true
9. ispunct() 如果参数是标点符号,该函数返回true
10. isspace() 如果参数是标准空白字符,如空格、进纸、换行符、回车、水平制表符或者垂直制表符,该函数返回true
11. isupper() 如果参数是大写字母,该函数返回true
12. isxdigit() 如果参数是十六进制的数字,即0~9、a~f、A~F,该函数返回true
13. tolower() 如果参数是大写字符,则返回其小写,否则返回该参数
14. toupper() 如果参数是小写字母,则返回其大写,否则返回该参数
vector 大法
求数组最值方法:
#include<vector>
vector<int> v(N);
//最大值
vector<int>:: iterator it = max_element(v.begin(),v.end())
//最小值
vector<int>:: iterator it = min_element(v.begin(),v.end())
cout<<*it<<endl;
不能用memset初始化vector
不该偷的懒,还是不要偷!!!
vector中有其自身的结构,不能单纯的按字节进行初始化。使用memset对vector进行初始化,会破坏vector中的结构,造成vector中的数据错误
reverse()
倒置字符串,用法为:
#include <algorithm>
vector<int> v(N);
//全部倒置
reverse(v.begin(),v.end());
//某一部分(i —— j)倒置
reverse(v.begin()+i,v.begin()+j);
set
常见方法:
begin() 最开始的一个元素
end() 最后一个元素
clear() 清空所有元素
empty() 判断是否为空
size() set的元素个数
insert() 插入元素
iterator 迭代器
这里写一下iterator用来遍历set的用法:
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
set<int>::iterator it;
for(it = s.begin() ; it != s.end() ; it++){
cout<<*it<<endl;
}
map
头文件:#include< map >
创建:map<key, value> mapname;
添加元素:
个人喜欢用数组:
mapname[key] = value;
迭代器:
map<key, value>::iterator it;
it->first======key
it->second ===value
sprintf 和 sscanf函数
头文件:#include<stdio.h >
sprintf
按照特定格式输入字符串;
sprintf(charstring, charformat, var);
sscanf
字符串按照特定格式输入到变量
sscanf(charstring , charformat,var );
string s,t;
double temp;
sscanf(s,"%lf",&temp);
sprintf(t,"%.2f",temp);
取整:
头文件:#include< cmath >
向上取整:比自己大的最小整数
ceil(num);
向下取整:比自己小的最大整数
floor(num);
四舍五入取整:
round(num);
最大公约数与最小公倍数
来源:http://www.360doc.com/content/19/0412/20/35418877_828346885.shtml
//最大公约数:辗转相除法
//写法一:
int gcd(int a, int b){
int y = b;
while(a%b){
y = a%b;
a = b;
b = y;
}
return b;
}
//写法二:
int gcd(int a, int b){
return b == 0 ? a : gcd(b, a%b);
}
//最小公倍数
int mcm(int a, int b){
return a*b/gcd(a,b);
}
一些有点意义的题:
1049 数列的片段和
1054 求平均值
刷题过程中一些常见的坑点QTQ
-
id为xxx位数字
比如:id为 5 位数字(从 00000 到 99999)
注意两点:1.输出用printf("%05d", id); 2. id 从00000 到 99999,所以赋初值时需要注意不能为0 -
输入为a,b,但是两数字大小不确定,而结果与a,b大小有关
需要判断a,b大小,保持一定的顺序
1062 最简分数 (20分) -
链表类的题,遍历时尽量用v[i].next!=-1(如果以-1作为链表结束条件),做为结束条件。题目中可能存在单独的结点,用for (int i = 0; i < N; ++i)不准确。
1075 链表元素分类 (25分) -
数学问题,找不到简便解法,暴力搜索,注意数据类型
1088 三人行