C++ STD标准模板库的泛型思想

 

 


在C++泛型程序设计领域中,最显著的贡献就是STL(StandardTemplateLibrary),它后来被采纳并引入到C++标准库中。

STL实际上是一个框架,它提供了许多有用的操作,我们也把这些操作称为算法;它同时也为对象集合提供了数据结构,我们把这些数据结构称为容器
算法和容器都以模板实现。

STL实现了算法和容器的分离:
算法并不是容器的成员函数,而是以一种泛型的方式编写的;因此任何容器(和线性的元素集合)都可以使用这些算法。为了实现这个目的,STL的设计者引入了一个称为迭代器的抽象概念,
任何种类的容器都提供了这些迭代器。从本质上讲,容器在针对集合方面的操作都被外包到迭代器的功能上了, 迭代器实现了一个统一的接口。

因此,如果要实现一个诸如计算容器中最大值的操作,我们并不需要知道诸如这些值在容器中是如何存储的这样的细节。

 

STL借助于迭代器对针对元素的操作进行了参数化,从而避免了操作定义在数量上的过度膨胀。在此,你并不需要为每个容器都实现每一个操作,只需要实现某个算法一次,就可以把该算法应用到每个容器中
换句话说,泛型程序设计的“粘合剂”就是:由容器提供的并且能被算法所使用的迭代器。

迭代器之所以能够肩负这样的任务,是由于容器为迭代器提供了一些特定的接口,而算法所使用的正是这些接口。我们通常也把每个这样的接口称为一个concept(即约束),它说明一个模板(即容器)
如果要并入这个框架(即STL),就必须履行或者实现这些约束

从原则上讲,也可以使用动多态来实现这些类似于STL的功能。然而,用多态实现的功能使用起来肯定会很受限制,因为与迭代器的概念相比,动多态的虚函数调用机制将会是一种重量级的实现机制,
这就会对效率产生很大的影响。 譬如增加一层基于虚函数的接口层,通常就会影响操作的效率,而且这种影响的程度可能是几个数量级的(甚至更加严重)。

从另一方面讲,泛型程序设计是相当实用的,因为它所依赖的是静多态,而静多态会要求在编译期对接口进行解析

 

举例:

std 算法库的找容器中的最大元素的算法函数:

template<class iterator>
iterator max_element(iterator beg, iterator end)
{
	//只是使用迭代器的操作来遍历容器中的所有元素,并以iterator的形式返回这个元素的位置
}

在此,每个线性容器并不需要提供诸如max_element()的成员函数,而只需要提供一个能够遍历序列中(它所包含的)所有值的迭代器类型,和一些能够创建这类迭代器的成员函数:

 

静多态的机制可以编写出非常基本的计算结构(如基本算法等)。与之相比,动多态需要选择一个公共基类,这就意味着动多态通常都需要作出特定于某一领域的决定。
于是,C++标准库的STL部分并没有包含动多态容器,却包含相当多的使用静多态的容器和迭代器,这也就不足为奇了。


Ref:

《C++ Templates, Chapter 14.5 》

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

First Snowflakes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值