C++泛型编程与STL标准模板库

引言

  标准模板库(Standard Template Library,STL) 是一个高效,实用的C++程序库。它被容纳于C++标准库中,是ANSI/ISO C++标准中最新的,也是极具革命性的一部分。该库包含了诸多计算机科学领域里常用的基本数据结构和基本算法,也为C++程序员们提供了可扩展的应用框架,高度体现了软件的可复用性。

STL概述

  STL在C++程序设计中的作用是提供一个可供函数调用的组件和函数库,当需要时通过接口来调用,STL的目的是标准化组件,用户不用重新开发它们就可以使用这些现成的组件。STL现在是C++的一部分,被内建在编译器之内。
  虽然STL是一个模板库,但其中也包含了许多部分。一般来说,STL由如下六个部分组成:

  1. 容器(Containers)用于管理数据集合,包括各种数据结构,比如:vector(向量),list(列表),deque(双队列),set(集合),map(映射)用来存放数据。
     从实现的角度来看,STL容器是一种类模板。
  2. 算法(Algorithms)定义了计算过程,包括各种算法, 比如:sort,search,copy,erase等。
     从实现的角度来看,STL算法是一种函数模板。
  3. 迭代器(Iterators)提供了遍历容器的方法,它扮演了容器与算法之间的胶合剂,即"泛型指针"。共有5种类型及其他衍生变化。
     从实现的角度来看,STL迭代器是一种将operator*,operator->,operator++,operator- -等指针相关操作予以重载的类模板。所有的STL容器都附有自己专属的迭代器。
  4. 仿函数(Functors)将函数封装在对象中,供其它组件使用。行为类似函数,可作为算法的某种策略
     从实现的角度来看,它是一种重载了operator()的类或者类模板,一般的函数指针可被视为狭义的仿函数。
  5. 配接器(Adapters)一种用来修饰容器,仿函数或迭代器的接口,如STL提供的queue(队列)和stack,虽然看似容器,其实只能算一种容器配接器,因为它们底层完全借助deque(双队列),所有操作都由底层的deque供应。改变functor接口的被称为function adapter(函数配接器),改变container接口的被称为container adapter(容器配接器)。
  6. 配置器(Allocators)负责空间配置与管理
     从实现的角度来看,配置器是一个实现了动态空间配置,空间管理,空间释放的类模板。

  STL的代码从广义上来讲可分为三类:容器,算法,迭代器。几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
  在C++标准中,STL被组织为下面的13个文件:< algorithms>,< deque>,< functional>,< iterator>,< vector>,< list>,< map>,< memory>,< numeric>,< queue>,< set>,< stack>,< utility>。

  • STL主要包含容器、算法和迭代器三个部分。容器实现了大多数数据结构;迭代器类似指针,通过它的有序移动将容器中的元素与算法关联起来,是实现STL的基础。
  • 迭代器是STL重要的核心技术,提供了统一访问容器元素的方法。迭代器即指针,可以是所需的任何类型,它最大的好处是使容器与算法分离。因为不同容器中完成相同功能代码的思路大体相同,将其抽象出来就产生了迭代器,这是泛型编程的思想。
  • 在自己动手编写迭代器时,要在类中增加begin()、end()函数,用于获取起止迭代指针,要增加相应迭代器类,重载相关运算符,从而可以调用。
  • 特定容器有特定的迭代器,故将迭代器作为内部类更适合应用。每个容器均有对应的迭代器,容器通过迭代器共享某一具体算法,而算法不具体依赖某一具体容器。由此可见,STL的编程思想是:1.形成容器元素;2.取出所需的迭代指针;3.调用通用算法。
    ( ps:此四段摘自原文: https://blog.csdn.net/huixieqingchun/article/details/79368351 )
发布了77 篇原创文章 · 获赞 19 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42932834/article/details/90731280
今日推荐