下面记录一下C++ 刷题的常用模板,基于c++ 17
输入处理
//待处理的字符串
string s = "a */b/c * */d";
//istringstream 用于出来输入的数据
istringstream iss(s);
//隔开后提取的字符串
string buffer;
//循环读取到buffer中,如果出现 a//b 输出第二行会有个空行,即buffer为""
while (getline(iss, buffer, '/')) {
cout << buffer << endl;
}
string data = " aaaa bbbb c ";
istringstream p(data);
vector<string> pt;
string in;
//第二种方式,只能默认的隔开空格,a前面的空格会被舍弃,不会有多的空行
while (p >> in) {
//如果有多个空格的字符串,用in != "" 来加入到动态数组中
cout << in << endl;
}
//getline 遇到特定字符截取
string sq;
getline(cin, sq, ',');
优先队列
sort(intervals.begin(), intervals.end(), [](vector<int> &a, vector<int> &b) { return a[0] < b[0]; });
function<bool(vector<int> &, vector<int> &)> cmp1 = [](vector<int> &a, vector<int> &b) {
return a[1] > b[1];
};
auto cmp = [](vector<int> &a, vector<int> &b) {
return a[1] > b[1];
};
priority_queue<vector<int>, vector<vector<int>>, decltype(cmp)> q(cmp);
priority_queue 可以套tuple,比如
priority_queue<tuple<double , int ,int>>q ,默认按第一个降序
tuple 取元素的语句为: get<1>(t),取tuple t 的第二个元素
vector用法
// 初始化
// p为10 个 2
vector<int> p(10, 2);
// 数组赋值
int a[] = {1, 2, 3, 4};
vector<int> p2(a, a + 4);
//迭代器赋值
vector<int> p3(p2.begin(), p2.begin() + 2);
// assign 复制
p.assign(p3.begin(), p3.end());
// resise 重新定义大小,带一个参数为控制大小到指定,第二个参数为 比原来多的空间补2
p.resize(10, 2);
//erase 删除迭代器元素,迭代器会指向当前的下一个元素, 一个参数为删除该迭代器一个元素
p.erase(p.begin());
//如果有两个参数,删除位置为前闭后开 [)
p.erase(p.begin(), p.begin() + 3);
//insert 第一个参数为插入位置,插入位置为迭代器的位置,有两个参数时 第二个参数为插入的元素
p.insert(p.begin(), 2);
//如果第三个参数,分别为(x,y,z) 则表示在x处 插入y 个 z
p.insert(p.begin() + 1, 3, 2);
set用法
//set 初始化
set<int> s1(p.begin(), p.end());
set<int> s2(a, a + 4);
set<int> inst;
cout << endl;
// 求集合s1,s2的交集,set_union 为并集,set_difference 为补集, 将集合得到的结果插入到inserter 中,第一个参数为 集合,第二个参数为插入的位置
set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(inst, inst.begin()));
string 用法
//string 初始化
string s = "123456";
// 从以S下标0 开始,长度为2的字符串初始化 S1 ,如果是两个参数,则从 下标到字符串结束的位置
string S1(s, 0, 2);
// 字符的前两个字符当做S2
string S2("1233333", 2);
//S3 为10个v,只能是第二个参数只能是字符
string S3(10, 'v');
//将s2 pos 开始的第n 个字符,替换成字符串S
S2.replace(pos, n, char * );
//将s2 pos 开始的第n1 个字符,替换成n2 个字符
S2.replace(pos, n1, n2, char);
// [ite1,ite2)的字符替换为字符串
S2.replace(ite1, ite2, char * );
// 截取 S2 n1下标,长度为n2 的字符串
S2.substr(n1, n2);
// 从n的位置寻找字符串s,返回索引下标,未找到返回-1
S2.find(char * s, n);
// 寻找字符,返回索引下标
S2.find(char s, n);