习题
1. 使用随机数生成器,生成0~9 999的10 000个整数,并将它们放到list<int>容器中(见7.1节),计算并打印它们的中间值。你期望的输出结果是什么?请计算每个值出现的频率(也就是说,出现了多少个0,多少个1,等等),并打印具有最高频率的数值。请使用vector<int>存储频率值。
2. 重新编写print(const list<double> &lst)函数,使它成为一个尽可能通用的模板函数(见7.1节)。
3. 为vector<> v编写一个算法,能够将值添加到元素v[2*i]中,即vector的偶数索引中。使用int和double类型进行测试。
4. 编写一段可输入字符串的程序,然后将字符串分解为一个单词列表,最后对这个单词列表排序并打印该列表。这里需要使用list<string>和STL。
5. 为list<T>编写下列成员函数:
iterator list<T>::insert(iterator w_it, T v);
该函数在w_it前插入v并返回指向插入元素的迭代器(见7.1节)。
6. 为list<T>编写下列成员函数:
void list<T>::erase(iterator w_it);
该函数移除w_it指向的元素(见7.1节)。
7. 编写一个算法查找任意容器类里存储的第二大元素。使用STL容器vector<T>、list<T>和set<T>进行测试。编写算法时假定使用前向迭代器和比较操作。
8. 为STL库函数count_if(b,e,p,n) 编写模板代码并测试,其中p是谓词,n是求和变量。
9. 使用STL容器类重写4.7节中的五张同花牌的程序。
10. 使用random_shuffle()代替原始代码中的shuffle(),重新完成习题9。为什么这种方法更好一些?
11. 改进stl_multiset.cpp程序,使用输出vegetable was eaten k times代替简单的无标识整数输出。实现该操作的一种方法是创建一个蔬菜名字数组,数组的索引为蔬菜的枚举值。
12. 将习题11中蔬菜的排序关系修改为lesser<vegetable>并打印结果。
13. 使用map创建一个包含食物和其对应卡路里的表。例如,胡萝卜-45,冰淇淋-250,等等。map中至少包含10种食物。每餐使用随机数生成器挑选4种食物,打印出所选食物及其卡路里。
14. 编写一个比较对象,该对象使用对象的平方值进行比较。因此,使用该比较对象后,一个大的负数比一个小的正数要大。在vector中产生-100~+100的整数,并使用这个排序对象调用STL的排序算法,打印最终结果。
15. 编写一个STL算法product(b1,e1,b2,c1)实现元素乘法,它将从b1开始的数和从b2开始的对应位置的数相乘,并将结果存储在以c1开始的位置。参数e1是第一个序列的警戒值。
16. (项目)设计一个数据类型class matrix,使用vector保存一个矩形元素数组。如何为这样的二维容器实现迭代器?考虑矩阵加法和乘法这样的基本存取操作和算法。







