任务描述
本关任务:编写一个能根据键盘操作记录还原实际输入的小程序。
相关知识
本关涉及到的内容如下:
list
容器的使用
list
容器的使用
list
位于头文件<list>
,是 STL
提供的一种顺序存储的容器,它不支持通过位置索引访问,但能高效的进行插入、删除元素操作,通常由双向链表实现。
list
是一个模板类,使用时需要指定模板参数,而且作为参数的类型需要有无参数的构造函数(如果不使用Allocator
)。
它常用的构造函数如下:
list<int> l(); //无参构造函数
list<int> l2(10); //包含10个默认值0元素
list<int> l3(10,123); //包含10个123元素
它的begin
,end
函数用于获取指向第一个元素的迭代器和指向最后一个元素之后的迭代器。
如果要修改容器内容,可以使用以下函数:
list<int> l;
l.push_back(1); //添加到链尾
l.push_front(2); //添加到链头
l.pop_back(); //删除链尾元素
l.pop_front(); //删除链头元素
l.insert(l.begin(),3); //在指定迭代器之前添加一个元素
l.erase(l.begin()); //删除指定迭代器所指的元素
list
的迭代器有一点特别,当对容器进行修改时,只要不是删除了这个迭代器对应的元素,这个迭代器都不会失效。 比如:
list<int> l;
list<int>::iterator it = l.begin();
l.insert(it,10); //执行之后it依然有效,并且现在it不再与l.begin()相等
l.erase(it-1); //执行之后it依然有效
l.erase(it); //现在it无效了
如果要查询list
的元素数量,可以使用以下函数:
int size = l.size(); //返回元素个数
bool isem = l.empty(); //容器为空时返回true
list
的成员函数不仅仅只有这些,感兴趣的同学可以查阅其他资料进行学习。
编程要求
学员需要读取输入的键盘操作记录,并根据操作记录还原最后的输入结果。
每一次的操作记录为一行字符串,字符串的内容分为以下几类:
- 大小写字母,数字:代表用户在输入光标左侧输入了一个具体字符,光标保持在新输入字符的
Begin-End
区域内。 <
,>
字符:代表用户按下了左键或者右键,作用是输入光标向左或者向右移动一个位置。[
,]
字符:代表用户按下了Home
键或者End
键,作用是移动输入光标到最开始或者最末尾的位置。
每一次操作记录开始的时候都是没有输入的。
注意:输入光标只能在已输入内容的两端和内部移动。
输入将会有多行,每一行代表一次操作记录,每次操作记录产生一行结果,具体见测试说明。
测试说明
测试输入: aa
a<b
预期输出: aa
ba
测试输入: a<ba[c
aa<<b]c
预期输出: cbaa
baac
#include <iostream>
#include <string>
#include <list>
using namespace std;
int main()
{
list<char> l;
list<char>::iterator it=l.begin();
char to;
while(1){
if((to=getchar())==EOF){
for(list<char>::iterator i=l.begin();i!=l.end();i++)
cout<<*i;
cout<<'\n';
l.clear();
it=l.begin();
break;
}
switch(to){
case '<':
if(it!=l.begin())
it--;
break;
case '>':
if(it!=l.end())
it++;
break;
case '[':
it=l.begin();
break;
case ']':
it=l.end();
break;
case '\n':
for(list<char>::iterator i=l.begin();i!=l.end();i++)
cout<<*i;
cout<<'\n';
l.clear();
it=l.begin();
break;
default:
l.insert(it,to);
break;
}
}
return 0;
}