7.17 练习
7-1 创建一个set<char>,打开一个文件(文件名在命令行中给出),每次从文件中读入一个char,将每个char放入该集合中。打印结果并观察其组织结构。在这个特定文件里的字母中有未被使用的字母吗?
7-2 创建3个Noisy对象序列,vector、deque和list。对它们进行排序。现在编写一个函数模板,接收vector和deque序列作为参数来对它们进行排序,并记录下排序的时间。编写一个特化的模板函数对list进行同样的操作(确保调用其成员函数sort()而不是使用通用算法)。比较不同类型序列的性能。
7-3 编写一个程序用来比较分别使用list:sort()以及std:sort()(STL算法版本的sort())对链表进行排序的速度。
7-4 创建一个发生器以产生0到20(包括20)之间的随机int型值,用它们填充一个multiset<int>。对每个值出现的次数进行计数,遵循例程MultiSetWord Count.cpp中给出的方法。
7-5 修改StlShape.cpp,让它用deque而不用vector。
7-6 修改Reversible.cpp,使其与deque和list一起工作而非vector。
7-7 使用一个stack<int>并将斐波那契(Fibonacci)数列存储其中。程序的命令行应该指明想要的斐波那契数列中元素的个数,还要有一个可以查看栈中是否剩下最后两个元素的循环,如果剩下最后两个元素,则在今后的每次循环中压入一个新的符合斐波那契数列的元素。
7-8 仅使用3个stack(源栈(source)、排序栈(sorted)和失败者栈(losers)),通过首先存放数字到源栈上,来对一个随机的数字序列排序。假定源栈上的栈顶元素是最大的,将其压入排序栈。持续地将源栈中的元素弹出并与排序栈中的栈顶元素比较。无论哪个栈数字最小,将最小的数字从其栈中弹出并压入失败者栈。一旦源栈为空,使用失败者栈作为源栈并重复该过程,并且使用源栈作为失败者栈。当所有的数字都已经被存入胜利者栈(排序栈)以后,算法结束。
7-9 打开一个文本文件,在命令行中提供其文件名。每一次从文件中读入一个单词,并使用multiset<string>为每个单词创建一个单词计数。
7-10 修改WordCount.cpp,使其使用insert()而非operator[]向map中插入元素。
7-11 创建拥有一个operator<和一个ostream&operator<<的一个类,该类应该包含一个具有优先级的数。为该类创建一个发生器,用来产生随机的具有优先级的数。用该发生器产生的数填充一个priority_queue,然后取出元素并观察它们是否按照正确的顺序排列。
7-12 重写Ring.cpp,使其用一个deque而非list作为其底层实现。
7-13 修改Ring.cpp,使其底层实现可以通过模板参数来进行选择。(将那个模板参数的默认值设为list。)
7-14 创建一个名为BitBucket的迭代器类,它仅接收发送给它的无论什么任何东西,而不会将其写到任何地方。
7-15 创建一种“猜单词”的游戏程序。创建一个类,该类包含一个char型成员和一个指示该char型成员是否已经被猜中的bool型成员。从一个文件中随机地选择一个单词,并且将其读入用户的新类型的vector。重复地询问用户对一个字符的猜测,在每次猜测之后,显示该单词中已猜中的字符,对未猜中的字符显示下划线。允许给用户提供猜测全部单词的方法。在每一次猜测之后对某个值减1,在该值到达零之前如果猜中了全部单词,则用户胜出。
7-16 打开一个文件,并将其读入一个字符串。使该串翻转并送入一个字符串流string stream。用标识符迭代器TokenIterator从该字符串流stringstream读入标识符并将其存入到list<string>中。
7-17 比较分别基于vector、deque或list实现的stack的性能。
7-18 创建一个模板用以实现一个名为SList的单链表。提供默认构造函数、begin()和end()函数(通过适当的嵌套迭代器),insert()、erase()和析构函数。
7-19 产生一个随机的整数序列,将它们存入一个int型数组。用其内容来初始化一个valarray<int>。用valarray操作计算这些数字序列的和、最小值、最大值、平均值和在序列正中间元素的值。
7-20 用12个随机值创建一个valarray<int>,用20个随机值创建另一个valarray<int>。将第1个valarray理解为一个3×4的int型矩阵,第2个解释为4×5的int型矩阵,并且根据矩阵乘法的规则将它们相乘。将结果保存在大小为15的valarray<int>中,它表示一个3×5的结果矩阵。使用切片将第1个矩阵的行分次与第2个矩阵的列相乘。将结果以长方形的矩阵形式打印出来。