※bits/stdc++.h:万能头文件,偷懒必备,看竞赛是否严格要求。
※iostream库:用于io操作(一般必须包含),cin、cout
※iomanip库:常用在输出保留小数(或者有效数字),与cout,fixed,setprecision()函数结合使用
setw(n):设置字段宽度的函数,是 <iomanip> 的核心函数;
left/right:属于输入输出格式操纵符,定义在 <iomanip> 中;
※string库:与char用途的区别,string存储的是字符串、而char存储的是单个字符,
①并不能将char单个字符直接通过=赋值给string,例如
string last_none_zero(int sum){
stringstream ss;
ss << sum;
string x = ss.str();
int len = x.length() ;
//错误方法
string last_num = x[len-1];
return last_num;
}
char c1 = 'a'; // ✅ 正确:单个字符用单引号
char c2 = '12'; // ❌ 错误:char只能存1个字符
char c3 = "a"; // ❌ 错误:双引号是字符串,不能赋值给char
// ===== string的初始化 =====
string s1 = "hello"; // ✅ 正确:多个字符用双引号
string s2 = 'a'; // ❌ 错误:单引号的char不能直接赋值给string(需转换)
string s3(1, 'a'); // ✅ 正确:用1个char构造string(你之前代码里用到的)
string s4 = string(1, c1); // ✅ 正确:char转string的标准写法
②对string赋值单个字符串可以进行赋值操作,例如
//y的1位置赋值x[1]的字符
string x = "12434312";
string y(1,x[1]);
③如若需要截取字符串中的某一段的值,可以是同substr()函数
- 索引越界:如果字符串长度为 0 或 1,调用
substr(1)会返回空字符串(不会报错,但需注意);→ 解决:加判断if (temp_str.size() > 1)再调用substr(1)(如你代码中那样)。 - 前导 0 问题:截取后得到 "04" 这类字符串,转数字时会自动变成 4(无需手动处理)。
- 参数顺序:
substr(pos, len)是 “起始位置 + 长度”,不是 “起始 + 结束位置”(新手易混淆)
④string.find()函数
1.在字符串内找到一个值,如'.',可以使用string.find('.')函数,若不存在这个值,则会返回-1,若存在,则返回这个值的下标(返回值:下标(从 0 开始))
2.多个相同字符:只返回第一个匹配的下标
| 场景 | 返回值 | 含义 |
|---|---|---|
| 字符串中包含 '0' | 数字(如 0、3、5) | '0' 第一次出现的下标位置 |
| 字符串中不包含 '0' | -1 | 未找到 |
⑤string.insert()函数,可以直接将指定元素插入其位置当中 string.insert(pos,'.');
※cmath库:
① sqrt(x):返回x的正平方根
② abs(x):返回x的绝对值
※vector库:引入字符串头文件,用于处理字符串拼接、转换等操作
例如:vector<int> num()的操作;
① vector方便初始化
vector<int> count_arr(110, 0); // 直接初始化所有元素为0,省去手动赋值
② vector不可以直接传数组,需要获取底层数组地址int* arr = v.data();把 vector 转成普通数组指针!!!!要把vector定义的数组传入函数,要传入num.data(),而非num[]。函数申明种可以用int num[]申明。
vector<int> num(n);
// 注意:vector不能直接传数组,需用.data()获取底层数组地址
cout << maxnum(num.data(), n) << endl;
③ 对于一些需要动态输入的数组更加方便!!!直接使用push_back动态扩容(向最后一个位置添加n),通过size()函数获取大小
while(cin >> n){
v.push_back(n);
cout << v.size() << endl;
}
④C++98 不支持vector<int> v = {1,2,3};:如果编译器是 C++98,改用push_back逐个添加。
⑤xxx.back()函数:返回数组最后一个值
注意:与xxx.begin(),xxx.end()区分,他们返回的是下标值,不是下标对应的元素值,若变成*xxx.begin(),*xxx.end(),则返回的下标对应的函数值!
⑥删除数组元素
1)pop_back()删除最后一个元素,会改变容器大小
vector<int> vec = {10, 20, 30};
vec.pop_back(); // 删除最后一个元素
2)使用erase()删除指定位置或范围内的元素:erase()函数可以删除指定位置的单个元素或指定范围内的多个元素,会改变容器大小
vector<int> vec = {1, 2, 3, 4, 5};
vec.erase(vec.begin() + 2); // 删除第三个元素
3)使用remove()删除指定值的所有元素:remove()函数用于删除容器中所有与指定值相等的元素,但不会改变容器的大小。通常需要与erase()函数配合使用。示例如下:
vector<int> vec = {1, 3, 3, 4, 3, 5};
int it = remove(vec.begin(), vec.end(), 3); // 删除值为3的元素
vec.erase(it, vec.end()); // 调整容器大小
set库:一种类似数组的容器,可以与vector对比着学。
与vector区别:不可以随机访问,即无法通过数组那样的num[i]访问到元素,比较复杂
优点:有比较好用的函数,例如insert(x)函数,可以直接插入元素并剔除重复项并自动排序。
①定义
#include <set>
set<long long> num_set;
②插入元素insert()
for (int i = 0; i < n; ++i) {
cin >> num;
num_set.insert(num);
}
③访问全部元素(已排序),访问需要用到迭代器
你的set定义是set<long long> num_set(存储long long类型),迭代器的模板参数必须和容器一致:
- 正确:
set<long long>::iterator(迭代器遍历long long类型的 set) - 错误:
set<int>::iterator(迭代器类型和容器元素类型不匹配,编译报错)
for (set<long long>::iterator it = num_set.begin(); it != num_set.end(); ++it) {
if (first) {
cout << *it;
first = false;
} else {
cout << " " << *it;
}
}
// C++11及以上支持的简化写法
for (auto it = num_set.begin(); it != num_set.end(); ++it) {
// 逻辑不变
}
※sstream库:引入字符串流头文件:用于整数和字符串的转换(替代C++11的to_string)
用法:
string int_to_string(int num) {
// 创建字符串流对象:相当于一个"中转站",可以存数字/字符串
stringstream ss;
// 将整数num写入字符串流(把数字"存"进中转站)
ss << num;
// 从字符串流中提取出字符串并返回(把中转站的数字转成字符串)
return ss.str();
}
①stringstream 在某些情况下可能会比直接操作数字慢,因为它涉及到缓冲区的处理和对象的构建。尤其是在需要频繁转换大量数字时,性能可能不如直接操作数字。
// 手动转化
string intToString(int num) {
string result = "";
while (num > 0) {
result += (num % 10) + '0'; // 获取最低位并转换为字符
num /= 10; // 去掉最低位
}
reverse(result.begin(), result.end()); // 反转字符串
return result;
}
② istringstream iss(line);

核心作用:把字符串 line 转换成一个 “字符串输入流”,让我们可以像读取 cin(键盘输入)一样,按空格分割读取里面的内容。
这里的line的内容类似为:ST CQ S8 D8 HQ D2 H3 HK H9 H2 HT SK CK
③ 字符串转数字:可以将字符串s(纯数字)的值赋值到a
string s;
int a;
cin >> s;
stringstream ss(s);
ss >> a;
※algorithm库:常用到其中的reverse()函数,来获取逆序的字符串
①reverse();
// 判断一个数是否是回文数
bool isPalindrome(int num) {
string str = intToString(num);
string reversed_str = str;
reverse(reversed_str.begin(), reversed_str.end());
return str == reversed_str;
}
②sort(all.begin(), all.end(), compareStudent)
排序函数,将数组的头下标和尾下标分别导入,可以由小到大排列(默认就是升序)
sort(gaps.begin(), gaps.end());
如何降序排列?
降序(由大到小)sort(gaps.rbegin(), gaps.rend())rbegin()是反向起始迭代器(指向最后一个元素),rend()是反向结束迭代器,相当于反向遍历排序升序(由小到大)sort(gaps.begin(), gaps.end())begin()指向第一个元素,end()指向最后一个元素的下一位,是sort的默认排序方式(升序)
sort(gaps.rbegin(), gaps.rend());
sort () 第三个参数的核心作用
sort(all.begin(), all.end(), compareStudent) 中:
- 第一个参数:排序起始位置(迭代器);
- 第二个参数:排序结束位置(迭代器);
- 第三个参数:比较函数(决定两个元素的排序优先级),返回
bool类型:- 返回
true:表示第一个参数排在第二个参数前面; - 返回
false:表示第二个参数排在第一个参数前面。
- 返回
map<string,int> count;
map可以用来定义两个不同变量类型的二维数组,以string为下标,count[string]的值一半为该string出现的次数
遍历:要string遍历
for (int len = L; len <= n; len++) {
for (int begin = 0; begin + len <= n; begin++) {
string sub = s.substr(begin, len);
int cnt = count[sub];
字符a比字符A大了32的ASCII码
1万+



被折叠的 条评论
为什么被折叠?



