您的位置:学习中国 推荐教程 C++C语言 正文
原作者:kuku 添加时间:2007-06-02 原文发表:2007-06-02 人气:15 来源:互联网

本文章共9546字,分6页,当前第5页,快速翻页:
 
-----------------------------------------------------------------------------------------------------------------------------------------------

本文提示:《C++之父Bjarne谈C++中的STL模板(5)》是本站编辑们为广大网友精选的实用文章,本文阐述了关于文章的相关理论,相对来说专业性强,但是本文只是针对于某个问题提出的见解与论述,未必能辐射到相关问题的方方面面,所以本文处理问题的方法仅仅为您提供一些参考。更多问题请查阅学习中国网其他栏目哦.

-----------------------------------------------------------------------------------------------------------------------------------------------



  STL的优雅和性能的关键在于--与C++本身类似--它是基于直接的内存和计算硬件模型的。STL的序列的概念基本上是把内存作为一组对象序列的硬件视点。STL的基本语法直接映射到硬件指令,允许算法最佳地实现。接下来,模板的编译时解析和他们支持的完美内联成为了把STL高级表达式高效率地映射到硬件层的关键因素。


  1.2 函数对象

  我将介绍STL使用的一些基本的技术,它会让你了解:在普通C++机制上建立的STL是如何提供空前的灵活性和性能的。迄今为止,我们所描述的STL框架组件都有些严格。每种算法都严格地采用标准指定的方法来准确地实现某种功能。例如,我们需要查找一个与自己指定的值相等的元素。实际上,查找一个带有某些(自己指定的)属性的元素,例如小于某个给定的值、匹配某个并非简单相等的值(例如,匹配大小写无关的字符串或者在允许很小差别的情况下,匹配双精度数值),是一项很普通的事务。

  下面的例子不是查找值7,我们将查找某些符合条件的值(也就是小于7的值):

vector::iterator p = find_if(v.begin(),v.end(),Less_than(7));
if (p != vi.end()) {
 // 我们找到了值小于7 的元素
 // …
}
else {
 // vi 没有值小于 7 的元素
 // …
}
  Less_than(7)是什么东西呢?它是一个函数对象,它是某个类的对象,该类带有应用程序操作符(( )),被定义成执行某个函数: templatestruct Less_than {
 T value;
 Less_than(const T& v) :value(v) { }
 bool operator()(const T& v) const { return v};
  例如: Less_thanf(3.14); // Less_than 保存了双精度值 3.14
bool b1 = f(3); // b1 为真(3<3.14 是真的)
bool b2 = f(4); // b2 为假(4<3.14 是假的)
  从2004年的情况来看,在D&E中没有提到函数对象是很奇怪的。我们应该使用一个章节来讲述它们。甚至于用户自定义的应用程序操作符(( ))的使用情况也没有提到,尽管它已经存在很长时间,并且很卓著。例如,它是几个最初的允许重载的操作符之一(在=之后),它还用于模仿Fortran下标(subscript notation)。

  我们可以编写一个find()版本,它使用了函数对象,而不是简单的!=来检测是否可以找到某个元素。它的名字是find_if(): template
In find_if(In first, In last, Pred pred)
{
 while (first!=last && !pred(*first)) ++first;
 return first;
}
  我们简单地用!pred(*first)代替了*first!=val。函数模板find_if()会接受任何能够把元素值作为参数调用的对象。特别地,我们可以把普通的函数作为它的第三个参数来调用find_if(): bool less_than_7(int a)
{
 return 7}
vector::iterator p = find_if(v.begin(),v.end(),less_than_7);
  但是,这个例子显示了,与函数相比我们为什么更喜欢函数对象:我们可以使用一个(或多个)参数来初始化函数对象,同时函数对象可以保持这些信息供以后使用。函数对象可以保持任何状态。这样就可以形成更通用、更优良的代码。如果我们需要,我们以后可以检查它的状态。例如: templatestruct Accumulator { // 保持 n 个值的总和
T value;
int count;
Accumulator() :value(), count(0) { }
Accumulator(const T& v) :value(v), count(0) { }
void operator()(const T& v) { ++count; value+=v; }
};
  我们可以把Accumulator对象传递给一个重复调用它的算法。其部分结果保持在对象中。例如: int main()
{
 vectorv;
 double d;
 while (cin>>d) v.push_back(d);
 Accumulatorad;
 ad = for_each(v.begin(),v.end(), ad);
 cout << "sum==" << ad.value
 

本文章更多内容<<上一页 - 1 - 2 - 3 - 4 - 5 - 6 - 下一页>>
本页地址
收藏到:[收藏夹] [百度搜藏] [新浪ViVi] [POCO网摘] [ 和讯网摘] [好哦网摘] [Google书签]
               
[搜狐网摘] [365Key网摘] [天极网摘] [我摘] [博采网摘] [igooi网摘]
相关文章

C++箴言:用成员函数模板接受兼容类型
探索C++的秘密之详解extern C
C++箴言:为类型信息使用特征类
创建可移植的64位应用程序代码
设计OutLook风格的工具栏
C++程序员必需的修养
如何编写异常安全的C++代码
在c++程序中重启自己的一种方法
踏入C++中的雷区——C++内存管理详解
C++的救赎 C++开源程序库评话
对象布局及多态探索之菱形结构虚继承
如何访问模板化基类中的名字
C++对象布局及多态之虚成员函数调用
理解隐式接口和编译期多态
C++程序中导出Word文档简易方法
C++程序设计从零开始之语句
对象布局及多态实现之成员函数的调用
C++箴言:谨慎使用私有继承
C++编程人员容易犯的10个C#错误
C语言 编程实例

相关评论


本文章所属分类:首页 推荐教程 C++C语言   C++C语言