如何更容易输出、格式化集合以及C++中的集合范围

ZDNet软件频道 时间:2002-10-09 作者:BUILDER.COM |  我要评论()
本文关键词:
在我的前一篇文章中,我介绍了如何用标准模板库(STL)流来简化格式化范围和容器。现在,让我们看看用我们熟悉的语法来写集合和集合范围是多么的容易。
在我的前一篇文章中,我介绍了如何用标准模板库(STL)流来简化格式化范围和容器。输出范围(range)只是简单的使用<<操作符。你可以使用range(第一个元素,最后一个元素 [,格式])来表示范围;用container(内容[,格式])来写一个容器。你可以提供格式器,用它在输出元素之前格式化它们。如果你不提供,系统会为你提供默认的格式器。


现在,让我们看看用我们熟悉的语法来写集合和集合范围是多么的容易。表A给出了一个如何编写集合的例子:
表 A

输出 编写方式 (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)的区别,你有必要考察在格式化范围/容器中所使用对象:

  • 格式器(formatter)对象决定了如何具体对每一个元素实施格式转化,以及如何输出。
  • 输出器(writer)对象允许你设置被写对象的环境(如前缀、后缀等)
  • 转换器对象允许你在写元素之前转换它们。

对集合来说,元素是std::pair< const Key, Value>(Key是集合的关键字,Value是集合的值类型)。(因为对集合来说,由于格式器/输出器的概念是相同的,它们可以leave the same*这句话翻不出来,是否可以略去)。然而,必须要用转换器来决定如何输出Key-Value对(与之相反的是顺序容器/range的value),这与顺序容器不同。

既然你处理转换器的方式不同,那么默认的转换也就不同。转化器会这样输出元素:“<key> -> <value>”——如:“easily -> 3”;而不是像顺序容器和range那样的输出value。这也意味着存在着不同的格式器。(格式器为容器提供默认的转换,而不对顺序容器这样做)。为此,我创建了coll_rangecoll_container函数,它们有类似与range/countainer的语法。


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134