一只小蒟蒻备考蓝桥杯的日志
文章目录
笔记
EOF识别
如果是一行行读入,cin 搭配 while 食用(真好吃
string str1;
while(cin >> str1){
cout << "cout: " << str1 << endl;
}
如果是一行(指 EOF 紧随数据其后,就不能食用了,失败案例如下)
解决方法:用 getline() 直接读一行走
transform 函数
参考 C++/C++11中std::transform的使用
头文件
真崩溃我说 一直以为在 string 里,debug 好久好久
#include<algorithm>
形态
一元
transform (InputIterator first1, InputIterator last1,
OutputIterator result, UnaryOperation op);
将op应用于[first1, last1)范围内的每个元素,并将每个操作返回的值存储在以result开头的范围内。给定的op将被连续调用last1-first1次。op可以是函数指针或函数对象或lambda表达式。(直接摘录自参考)
用法1:字符数组大小写转化
::tolower ::towupper
上面两个要背下来 无自动补全
#include<algorithm>
string str1, str2;
transform(str1.begin(), str1.end(), str1.begin(), ::tolower); // 小写
transform(str2.begin(), str2.end(), str2.begin(), ::towupper); // 大写
普适用法,自编 op
可以手动编写 op,示例如下(直接摘录自参考)
将[first1, last1)范围内的每个元素加5,然后依次存储到result中。
int op_increase(int i) {return (i + 5)};
//调用std::transform
std::transform(first1, last1, result, op_increase);
(一元)行为解释 摘自 cppreference
template<class InputIt, class OutputIt, class UnaryOperation>
OutputIt transform(InputIt first1, InputIt last1,
OutputIt d_first, UnaryOperation unary_op)
{
while (first1 != last1)
*d_first++ = unary_op(*first1++);
return d_first;
}
find 函数
参考 c++string函数 find、rfind详细用法
头文件
#include<string>
father.find(son)
从头开始找,返回值是子串在母串中的下标位置。
如果没有找到,那么会返回一个特别的标记npos,一般写作 string::npos (背下来,无自动补全)
#include<string>
string father, son;
if(father.find(son) != string::npos) {
cout << "Find it!" << endl;
cout << "The first index of the alphabet is " + father.find(son) << endl;
} else {
cout << "Didn't find it..." << endl;
}
father.find(son, begin_pos)
与前者相比,区别在于 它不是从头开始查找,而是从下标为begin_pos开始查找
查找目标字符串在母串出现的总次数
核心在于 对 含begin_pos 的合理利用
#include<string>
string father, son;
int cnt = 0, index = 0;
if(father.find(son) != string::npos) {
while(father.find(son, index) != string::npos){
index = father.find(son, index) + 1; // core
cnt++;
}
}
other usage
- father.find_first_of(son) , father.find_last_of(son)
- 逆向查找 rfind()
reverse 函数
参考 C++中的reverse()函数
实现翻转数组,字符串,向量
头文件
#include <algorithm>
用法
reverse(str1.begin(), str1.end())
我觉的 transform 一定也可以实现,但是懒得写 op 了(我也不太会…既然有轮子,那么
string 部分 copy
[begin_pos, end_pos) 左闭右开
string str;
int begin_pos, end_pos;
string str1(begin(str)+begin_pos, begin(str)+end_pos);
刷题
- P1308 [NOIP2011 普及组] 统计单词数
- P1553 数字反转(升级版) 注:未过(明天 2024年1月21日 一定)
心得
-
第1题(统计单词数)很 easy (如果掌握了一些很巧妙的方法的话)
- 要求是 严格查找
给定的是 “apple” 可以前后添加空格“ ”截断 -> " apple " - 利用 transform 大小写转换
- 利用 find() + begin_pos 数数
- 要求是 严格查找
-
第2题思路很 easy 我说,拆解了字符串,用了 reverse 函数,但是细节(0输不输出)卡我,我的代码好丑,改不动了,明天借鉴一下大佬的方法,心得写明天的博客里。
-
真崩溃我说,transform reverse 函数在algorithm 头文件里…一直以为在 string 里
小结
Oh no!乖宝,你怎么进度这么慢!
明天一定一定要快快快起来!
(毕竟后天乖宝要去杭州玩啦,断更2天嘻嘻)
小蒟蒻好荣幸发现自己的备赛日志受到你的关注,2024寒假无特殊情况坚持日更!