输出 | 编写方式 (style of writing) |
Easily -> 3, collections -> 12, write -> 5 | 默认 |
Easily -> 3 collections -> 12 write ->5 |
使用格式器 (定制转换方式并定制输出) |
[Easily] -> [3]; [collections] -> [12]; [write] -> [5]. |
使用格式器 (定制转换方式并定制输出) |
Key: Easily, Value: 3; Key: collections, Value: 12; Key: write, Value: 5. |
使用格式器 (定制转换方式并定制输出) |
Word 'Easily' appeared 3 time(s); Word 'collections' appeared 12 time(s); Word 'write' appeared 5 time(s). |
使用格式器 (定制转换方式并定制输出) |
Word 'EASILY' appeared 3 time(s); Word 'COLLECTIONS' appeared 12 time(s); Word 'WRITE' appeared 5 time(s). |
使用格式器 (定制转换方式并定制输出) |
[0] Word 'Easily' appeared 3 time(s); [1] Word 'collections' appeared 12 time(s); [2] Word 'write' appeared 5 time(s). |
使用格式器 (定制转换方式并定制输出) |
输出一个集合
集合是相关联的数组,它的关键字与对应数值相关(如std::map, std::multipap)。由于集合属于容器,所以你可以假定容器的range函数同样适用于集合。但是,请仔细看如下代码:
// 试图解析一个文件,并计算文件中每个词重复次数
std::map< std::string, int> collWordCounts;
// … code
std::cout << container( collWordCounts) <<
std::endl;
这段代码会在编译时产生错误。集合中每一个元素都是std::pair< const Key,Value>(具体在我们的例子中为std::pair< const std::string, int>)。它们没有定义<<操作符,因此会产生错误。即使定义<<操作符,它也未必就满足我们的需要。你也许希望输出如下所示:
‘easily’ -> 3
‘write’ -> 5
‘collections’ -> 12
或者,更好的如下:
Word ‘easily’ appeared 3 time(s).//单词easily出现了3次
Word ‘write’ appeared 5 time(s). //单词write出现了5次
Word ‘collections’ appeared 12 time(s). //单词colletions出现了12次
为了理解输出集合与输出顺序容器(sequence container)的区别,你有必要考察在格式化范围/容器中所使用对象:
对集合来说,元素是std::pair< const Key, Value>(Key是集合的关键字,Value是集合的值类型)。(因为对集合来说,由于格式器/输出器的概念是相同的,它们可以leave the same*这句话翻不出来,是否可以略去)。然而,必须要用转换器来决定如何输出Key-Value对(与之相反的是顺序容器/range的value),这与顺序容器不同。
既然你处理转换器的方式不同,那么默认的转换也就不同。转化器会这样输出元素:“<key> -> <value>”——如:“easily -> 3”;而不是像顺序容器和range那样的输出value。这也意味着存在着不同的格式器。(格式器为容器提供默认的转换,而不对顺序容器这样做)。为此,我创建了coll_range和coll_container函数,它们有类似与range/countainer的语法。