Skip to content

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 std::string Scanner(const std::string& op){ //your code here }

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了,可以的话,请您参考添加页面,与大家一起分享你的题解!