string
substr(size_t Off,size_t Count)
获取字符串从off位置开始长度位count的子串
对于字符串str="“David Beckham”", 如果要获取其中的字母串:
s.substr(2,str.length()-3);
结果为David Beckham
replace()和find()
如果要将某一行的所有"{{ abc }}"替换为str=“123”,可以这样做
int pos=s.find("{{ ");
while(pos!=std::npos){
int epos=s.find(" }}");
if(epos!=string::npos){
int length=epos-pos+3;
s=s.replace(spos,length,str);
}
pos=s.find("{{ ",pos+str.length()-1);
}
大小写转换函数
transform(str.begin(),str.end(),str.begin(),::tolower);//toupper
vector
插入
iterator insert( iterator loc, const TYPE &val );
在位置loc之前插入值为val的数据。
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
//在位置2前插入数值5
v.insert(v.begin()+2,5)
操作后v: 1253
查找
虽然vector不像map一样自带了find函数,但可以使用std的find函数用来查找某一数据。
v.push_back(1);
v.push_back(2);
v.push_back(3);
vector<int>:: iterator it=std::find(v.begin(),v.end(),3);
cout<<*it<<endl;
结果输出为3。
有时候,如果需要查找的数据不是基本数据而是类、对象或者类中的某个成员变量,可以使用find_if函数。
#include<bits/stdc++.h>
using namespace std;
struct Point{
int id;
int x,y;
Point(int id,int x,int y):id(id),x(x),y(y){
}
bool operator() (const Point &test){
if(test.id==id)
return true;
return false;
}
};
int main() {
vector<Point> vp;
vp.push_back({1,2,3});
vp.push_back({2,3,4});
vector<Point>::iterator it=std::find_if(vp.begin(),vp.end(),Point(1,0,0));
if(it!=vp.end()) {
cout<<"yes"<<endl;
}
}
上面的代码会查找容器中的id为1的元素,最后结果查找成功,输出“yes”。
在这里重构函数operator()可以达到查找某个成员的目标(必须返回为bool且参数为const的对象引用)。
排序
sort(v.begin(),v.end());
注意区分不同容器的排序函数的写法
二维数组的初始化
vector<vector<int>> grid(10,vector<int>(8));
int line=grid.size();//二维数组的行数
int col=gird[0].size();//二维数组的列数
map
一、插入
map<string,string> mp;
mp.insert(std::pair<string,string>("abc","123"));
map<char,int>mp;//key为字符,value为字符出现的次数
//按照次数从大到小排列,如果次数相同,按照字符ASCII从小到大排序
vector<pair<char,int>>vec(mp.begin(),mp.end());
stable_sort(vec.begin(),vec.end(),[](const pair<char,int>& a,const pair<char,int>& b){
return a.second>b.second;
});//stable_sort函数实现在排序的同时不改变相对顺序,后面lamda的表达式方便比较pair
for(auto& entry:vec)
cout<<entry.second;
set
set插入insert时能自动实现字典排序并保证唯一性。
list
list和vector相比,在涉及到大量数据的添加和删除时,如果使用vector造成代码超时,则考虑改为list(参考CSP201812-3 CIDR合并)
基本操作
l.sort();
l.unique();//去重
bool cmp( &, &){..};//用于修改排序比较的方式
list<int>::iterator it=l.begin();
it=l.erase(it);//删除迭代器当前元素后,必须重新赋值迭代器,否则迭代器失效
//插入前l: 1 2 3 4 5 it指向3
l.insert(it,6);//1 2 6 3 4 5 it仍然指向3
l.insert(it,7);//1 2 6 7 3 4 5 it仍谈指向3
l.insert(it--,8);//此代码执行后,it指向7而不是新插入的8
//因此如果要指向新插入的元素,必须在插入的代码后面单独添加--it;的代码