1386: いつから降り始めた 長い雨に
题目
题目描述
窗外开始下雨,屋内的助教看着使用流输入的小朋友被“新循环输入”折磨,深感同情,特别想向小朋友们介绍std::stringstream
(在sstream
库中)。使用std::stringstream
时,先用std::stringstream
类声明一个对象,然后就可以类似于cin/cout
的集合体进行流输入输出的操作。
但授人以鱼不如授人以渔,助教于是决定让小朋友们实现一下std::stringstream
的部分功能(不完全一致)。由于课程还没上到结构体或类,所以助教打算用模板函数来替代结构体或类(为什么要这么做?因为课上已经教了模板函数!注意:本题的写法只是为了考察知识点,并不建议实际应用)
为了确保公平性,本题禁止在函数外定义变量,禁止使用class,struct,std::stringstream
,除std::string
外的stl,为了避免Compile Error,也请不要使用using namespace ...
。
请完成Scanner
函数。Scanner
函数是参数为非类型参数的模板函数,可以通过给定不同的int
来实例化。
c++
template<int T>
string Scanner(const std::string& op){
//your code here
}
op的长度不超过256,存入Scanner的字符总数不超过单个string的maxlength。初始化时每个Scanner都为空。
在使用Scanner
函数时,用不同的T对应不同的实例化变量。例如Scanner<1>("put Hello World!")
和Scanner<2>("put Winnter is coming.")
是对两个对象的操作。
具体可以用以下代码来测试,提交只需要提交上面那个框里的函数(或其他辅助函数),提交中出现main函数、头文件引用等将直接CE。你提交的函数将会在一个hpp
中,因此你可以自由的定义需要用到的工具函数来简化代码。
```c++
include
include
template
int main(){ Scanner<1>("put Hello world!"); Scanner<2>("put Winnter ,,is,, comming."); Scanner<2>("put Please hold on!");
while (Scanner<1>("hasNextToken")=="Yes") {
std::cout<<Scanner<1>("nextToken")<<',';
}//运行结果是:Hello,world!,
std::cout<<'\n';
Scanner<2>("set 2 32 44");//set char_1=' ' ,因为空格的ASCII码为32;char_2=',',因为逗号的ASCII码为44.
while (Scanner<2>("hasNextToken")=="Yes") {
std::cout<<Scanner<2>("nextToken")<<' ';
}//运行结果是:Winnter is comming. Please hold on!
return 0;
} ```
你的每份代码均会被检查,但最终成绩以最后一次提交为准,请遵守题目的限制要求,否则该份提交将被判为0分。
Hints:
1、如何使得函数的成员变量在调用结束后不消亡?
2、请注意string成员函数的时间复杂度。
数据范围
对于$60\%$的数据,字符总数不超过$5000$。
对于所有的数据,字符总数不超过$500000$。
Oops! 本题目还没有解答!
助教老师们编题的速度,已经超过了解题的速度!
OJ翻了一新,但本解答集还大多用的是2017-2019级,甚至更早的同学们贡献的答案。
如果你已经AC了,可以的话,请您参考添加页面,与大家一起分享你的题解!