lqb日志04

一只小蒟蒻备考蓝桥杯的日志

笔记

EOF识别

如果是一行行读入,cin 搭配 while 食用(真好吃

string str1;
while(cin >> str1){
	cout << "cout: " << str1 << endl;
}

如果是一行(指 EOF 紧随数据其后,就不能食用了,失败案例如下)
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
  1. father.find_first_of(son) , father.find_last_of(son)
  2. 逆向查找 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);

刷题

  1. P1308 [NOIP2011 普及组] 统计单词数
  2. P1553 数字反转(升级版) 注:未过(明天 2024年1月21日 一定)

心得

  1. 第1题(统计单词数)很 easy (如果掌握了一些很巧妙的方法的话)

    1. 要求是 严格查找在这里插入图片描述
      给定的是 “apple” 可以前后添加空格“ ”截断 -> " apple "
    2. 利用 transform 大小写转换
    3. 利用 find() + begin_pos 数数
  2. 第2题思路很 easy 我说,拆解了字符串,用了 reverse 函数,但是细节(0输不输出)卡我,我的代码好丑,改不动了,明天借鉴一下大佬的方法,心得写明天的博客里。

  3. 真崩溃我说,transform reverse 函数在algorithm 头文件里…一直以为在 string 里

小结

Oh no!乖宝,你怎么进度这么慢!
明天一定一定要快快快起来!
(毕竟后天乖宝要去杭州玩啦,断更2天嘻嘻)

小蒟蒻好荣幸发现自己的备赛日志受到你的关注,2024寒假无特殊情况坚持日更!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值