练习12.26
用allocator重写第427页中的程序。
解答:
#include <iostream>
#include <memory>
#include <string>
using namespace std;
int main(){
string *const p = new string[10]; // 构造n个空string
string s;
string *q = p; // q指向第一个string
while (cin >> s && q != p + 10){
*q++ = s; // 赋予*p一个新值
}
const size_t size = q - p; // 记住我们读取了多少个string
// 使用数组
delete[] p; // p指向一个数组; 记得用delete[]来释放
}
这是原始程序,这里我用10把n替换了。
#include <iostream>
#include <memory>
#include <string>
using namespace std;
int main(){
allocator<string> alloc;
auto const p = alloc.allocate(10); // 构造10个空string
string s;
auto q = p; // q指向第一个string
while (cin >> s){
alloc.construct(q++, s);
}
const size_t size = q - p; // 记住我们读取了多少个string
// 使用数组
alloc.deallocate(p, size);
}
修改后的。
allocator在STL中算是比较神秘的,这里用到就是分配内存的功能。
对内存中的内容,做不了读取操作,只能进行构造写入。
所以,大型项目中可以用来做内存管理;小型项目中几乎用不着。
练习12.27
TextQuery和QueryResult类只使用了我们已经介绍过的语言和标准库特性。
不要提前看后续章节的内容,只用已经学到的知识对这两个类编写你自己的版本。
解答:
其实,看不看后面章节也无所谓。
这题就不写类的实现了,这里对这两个类进行分析,说一下实现思路,也许在以后我再看这道题的时候会有更好的方案。
TextQuery 就是以各种方式对文本进行存储,比如,每一行都是什么内容,文本一共有多少个单词(不重复的和重复的),每个单词对应的行。
QueryResult也就是交互部分,可以对文本进行各式各样的查询。比如,第几行什么内容,某个单词出现了多少次,都出现在了那几行中等。
参考书中的实现,来添加你要的功能,我认为才是这道题真正想要表达的。
练习12.28
编写程序实现文本查询,不要定义类来管理数据。你的程序应该接受一个文件,并与用户交互来查询单词。
使用vector、map和set容器来保存来自文件的数据并生成查询结果。
解答:
不写类的实现了。
如果要做,可以根据不同容器的特点与想要实现的功能对应起来。
练习12.29
我们曾使用do while循环来编写管理用户交互的循环(参见5.4.4节,第169页)。
用do while重写本节程序,解释你倾向于哪个版本,为什么。
解答:
个人喜欢while形式,不喜欢do while形式,可能受到linux shell实现的影响。
不过,do while也是可以用的,这里需要看是闲者的喜好和实现的难度。