快速业务通道

用标准模板库STL实现文件比较

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
h_back(v);
}

注意在"template"关键字的后面是一对空的尖括号,这样声明了一个类属的特例化。可以声明任意多个特例化。

Container_Differences函数模板

在把文件读进容器之后,就要用Container_Differences函数来进行比较。

这也是用模板写成的函数,可以用于其他应用。它调用addElementToSet函数模板往容器里增加不相同的字符串。函数虽然不使用返回值,但容器的内容一直在发生变化。最后,如果容器里没有成员,意味着比较的文件是相同的。下面是Container_Differences函数代码:

template<class container_type,class value_type>
void Container_Differences(const container_type &container1,
 const container_type &container2,
 container_type &result_grp)
{
container_type temp;
container_type::const_iterator iter_pos_grp, iter_found_at;

if(&container1 != &container2)
{
 iter_pos_grp=container1.begin();
 while(iter_pos_grp!=container1.end())
 {
 iter_found_at=find(container2.begin(),
  container2.end(),
  (*iter_pos_grp));

 if(iter_found_at==container2.end())
  addElementToSet(temp,
  static_cast<value_type>((*iter_pos_grp)));

 ++iter_pos_grp;
 }

 iter_pos_grp=container2.begin();
 while(iter_pos_grp!=container2.end())
 {
 iter_found_at=find(container1.begin(),
  container1.end(),
  (*iter_pos_grp));

 if(iter_found_at==container1.end())
  addElementToSet(temp,
  static_cast<value_type>((*iter_pos_grp)));

 ++iter_pos_grp;
 }
}
temp.swap(result_grp);
}

可以看到文件比较过程是相当简单的,这是设计出发点。函数只作一件事,而且要做好。

函数在对每个源文件容器的搜索循环里反复调用begin()和end()函数。end()函数在检测到零(null)字符(C字符串的结尾)时结束。用STL的find()函数寻找相同字符串,如果没有找到,说明存在着不同的字符串,就返回end()并将字符串加入到结果容器。

函数的最后一行用swap()函数将临时容器的内容拷贝到引用参数的结果容器,并释放临时容器。

仔细看一下,可以看到迭代器用static_case<>指向值的类型,因为编译器有时无法处理addElementToSet()所需的数据类型。另外使用static_case<>能使代码看得更清楚些。

函数的参数中,前二者是常量(const)参数,最后一个是非常量参数,用于写入结果。这样可以使程序占用的内存较少。

模板支持的不同容器类型

上面的代码可以支持这些容器类型:

队列(list)

集合(set)

向量(vector)

只要在主函数main()里作一次改动就能轻易地改变使用的容器类型。如果你要将集合类型改为向量类型,将:

typedef set<string> stringSet;

改成:

typedef vector<string> stringSet;

就行了。

当然要重新编译一下(要确保包含文件中有所需要的容器类型)。

还可以对addEmenetToSet()函数模板进行特例化来支持其他类型的容器,比如映象(map)。只要使用的容器支持迭代操作就能用于这段代码。如果要在你的应用里使用Container_Differences函数,要先对函数addEmenetToSet()作类属特例化处理。

结语

本文涉及内容很多。最主要的是了解如何使用C++模板来创建STL的类属元素。我们还介绍了如何将应用分拆到几个专项函数中去,每个函数只作一件事并作得很好。从而使得整个执行过程显得简单并易于理解和维护。

这里所做的工作都是为了建立柔性应用系统,充分利用现有元素的优点,减少设计、开发和测试时间。建议阅读其他有关STL,C++模板及C++语言特征的资料,将你的应用程序改变得更有生命力。

代码

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号