1. string
- string.find(string a, pos) a是子字符串,pos是查找开始的位置,不填的话默认为0,这里要注意,如果不存在要找到东西,则返回的是string.npos;
- string.length() 返回string长度;
- string.substr(int start, int length) start是子字符串开始的位置,length是子字符串的长度;
- string.resize(int) resize可以初始化string的大小,可以让string使用scanf以及类似char[]的操作;
2. char大小写转换
头文件为:#include
变为大写:char = toupper(char)
变为小写:char = tolower(char)
3. vector
- vector.size() 返回vector的大小
- vector.push_back(Elem) 在vector的最后压入元素;
- vector.pop_back() 删除vector中最后一个元素;
- vector.assign(begin, end) 清空容器,进行赋值操作;
4. set
- set.insert(Elem) 在set中插入元素;
- set.size() 返回set的大小
- set.find(Elem) 如果找到返回迭代器,如果没有找到,返回set.end()
遍历set的操作:
set::iterator iter = set.begin();
for(;iter!=set.end();iter++){
//do something
cout<<*iter<
5. map
- map[Elem1] = Elem2 在map中以数组的方式插入数据;
- map.find(Elem) 查找成功返回iterator,失败返回map.end();
map中每个元素的本质其实是pair;pair是可以使用pair.first和pair.second来表示第一个元素和第二个元素;
当使用迭代器时,(*iterator).first是map的key,(*iterator).second是map的value值;
而在排序的时候,是无法直接对map使用sort,我们可以考虑将map先转化为vector>来进行自定义排序;
其中,map和vector的转换代码为:
vector> temp(map.begin(),map.end());
6. 常用方法
6.1 头文件为:include
- sort(a, a+length) a为第一个元素地址,length为需要排序的元素个数;
- sort(vector.begin(), vector.end()) 这是vector排序;
- sort(a, a+length, cmp) 其中cmp是自定一个的函数(bool cmp(a, b));
- reverse(a, a+length) a为第一个元素地址,length为需要逆转的元素个数;
- swap(a, b) 其中a,b可以是容器,可以是变量;
- find(a, a+length, val) a为第一个元素的地址,length为查找范围,val是查找到值;
- copy(a, a+length, b) a为输入元素地址,length为复制范围,b为输出元素首地址;
- fill(a, a+length, val) a为初始化元素首地址,length为初始化范围,val为全部初始化的值;
6.2 头文件为:include
- fabs(double) 取double的绝对值;
- abs(int) 取int的绝对值;
- round(double) 对double类型进行四舍五入;
- sqrt(double) 返回double的算术平方根;
6.3 关于排序:
sort(a, a+length) 一般是将a按照ascii码的顺序排序;
sort(a, a+length, cmp) 是需要自定义排序时候,按照自定义的方法排序;
cmp函数的示例如下:
//按照从小到大排序;
//其中假定是将vector 排序,因此参数为string a和string b;
bool cmp(string a, string b){
return a
6.4 初始化数组:
// fill(first, last, val);
int a[100];
fill(a,a+100,1);
6.5 最大值最小值:
int num[]={2,3,1,6,4,5};
cout<<"最小值是 "<<*min_element(num,num+6)<
6.6 绝对值:
abs(int);
fabs(double);
6.7 最大公约数:
int gcd(int a, int b){
return b == 0 ? a : gcd(b, a % b);
}
6.8 最小公倍数:
int c = gcd(a, b);//最小公倍数可以利用最大公约数;
int lcm(int a, int b){
return a*b/c;
}
6.9 set和vector之间的相互转换(可以用作为vector去重):
//set初始化vector
vector.assign(set.begin, set.end());
//vector初始化set
set(vector.begin(), vector.end());
7. 刷题技巧
- 绝对值在10^9以内的整数要用int;超过2*10^9要用long(10^18以内);
- 要注意“不超过”这样的字眼,意味着比较的时候应该用<=(或者>=);
8. 关于各个类型的转换
可以使用stringstream
eg:
#include
stringstream ss;
string a="12";
int b;
ss<>b;
如果需要多次使用ss的话,可能还要用到ss.clear();
9. 输出输出以及格式问题
- 如果是多循环的输入输出,一般使用scanf和printf,这样会提高很多效率,以防止时间限制;如果是输入输出单个固定,可以使用cin和cout;
- 如果需要格式的输出,一定使用printf
printf的一般格式(一定要注意题目输出的int的形式):
- printf("%6d", int); 输出为十进制最多6位的整数;
- printf("%06d", int); 输出为十进制最多6位的整数,最高位补0;
- printf("%6.4f", float); 输出6位,其中小数点后4位;