C++ STL #1

STL , 全称为standard template library, 翻译过来就是标准模板库。

STL是C++的一个software library。 STL为C++程序员提供了四个components:

(1)algorithms(算法)

(2)containers(容器)

(3)functional (仿函数)

(4)iterators

这四个components 可以说是C++ programmer 的编程利器。 从而支持generic programming(泛型编程)。

 

STL为我们提供了一些已经打包好(ready set of common classes)的常见的类集合, 这些常见的classes 包括containers(容器类)和associative arrays(关联数组类)。 这些所有的类集合可以被用于userdefined type(用户自定义类型, 这个user-defined type 支持copy 和 assignment等基本的操作)和一些内置的(built-In types)数据类型。 

STL algorithms  是和containers 类独立存在的, 而不是直接针对于某些类的。 正是因为如此, 这个库(STL)的复杂度才大大降低了(reduces the complexity of the library)。

 

那么STL这么强大, 他是通过什么实现的呢?

答案是template(模板)。 还记得吗, 关于C++ 的一个重要的特性就是多态(polymorphsim)。 多态分文编译时多态( compile-time polymorphism)和运行时多态(run-time polymorphism)。 值得注意的是, 编译时的多态比运行时多态有的时候更加efficient。  模板(template)实现的就是compile-time polymorphism。现在的很多C++编译器都能够很好的最小化因为大量的使用STL编程所带来的抽象的代价。 (Modern C++ compilers are tuned to minimize any abstraction penalty arising from heavy use of the STL.)。

在Alexander Stepanov、Meng Lee和David R Musser在惠普实验室编写STL的时候, 有四个ideas in mind:

(1)  generic programming(泛型编程)

(2) abstractness without loss of efficiency,(抽象而不失效率)

(3) the Von Neumann computation model(VN计算模型)

(4) value semantics.

STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是标准C++的一部分,因此不用额外安装什么(参考百度百科)。 STL的模块定义在命名空间std中。 我们需要使用 using namespace std ;编译指导语句, 告知编译器我们使用标准C++ 库。

下面简要介绍下着四个重要的组件。

一. Containers(容器)

一个容器是存储着一系列(a collection of other objects )objects的, 我们将这些objects 称为container的元素(its elements). 容器主要通过implement成为 class templates,which allows a great flexibility in the types supported as elements.

 Container Types(容器)主要分为三种:

   (1) Sequence containers(线性容器): 即该容器中的元素存储是线性序列。 有三种: vector, list, deque。

    (2) associative containers(关联式容器): 关联式容器可以直接依靠键来访问容器中的元素。顾名思义, 关联式, 就是键和值的关联。 不是线性结构, 共有四种关联式容器, 有四种: set, multiset, map, multimap。 这四个容器使用树的结构来存储数据。它们支持快速的元素搜索, 删除, 插入。 不过这几个容器随机访问很慢, 排序的效率也很低。

          容器set 和multiset 可以存储一些的数据项。并提供了利用键来操作他们的功能。 键的特点就是唯一的。 我们可以用键来操作存储的这些数据。例如, 一个set 可能存储一些Student 类的对象。 他们以学生的学号为键(或者以学生的名字为key), 我们可一利用学号作为键来查找特定的学生。

     set 和multiset的主要区别是, multiset (可以理解为multiple-key set)允许数据项重复(allows duplicate elements), 而set 不允许。

    map 和 multimap(可以理解为multiple-key map) 可以存储成对的数据项,即{key,value}对。  一个称为键(key), 一个称为值(value)。  通过使用和value 相关的键, 可以操作容器内的值。这些值有时称为映射值。

   map 和 multimap的主要区别就是map只允许给定的值只有一个键值, 而multimap则允许值拥有多个键。

      

   (3)Container adaptors(容器适配器): 又称为衍生容器。 共有三种: stack(栈, LIFO), queue(队列, FIFO), priority queue(优先队列)。 栈,队列, 优先队列均是由线性容器(sequential containers)创建。 但是他们不支持迭代器。 我们不能用迭代器(iterators)对这类容器中的数据进行处理。 然而这类容器只支持两个函数: pop() 和push(), 实现数据的删除操作和插入操作。 

 

 为了更好的明白相关的容器类的结构, 参加如下图:

Linked List:

Stack:

 

Queue:

Deque:

 

相关容器的member function(成员函数), 当然不考虑上面的已经在上表格中的建构子和解构子:

vector类的重要成员函数:

 

list 类的重要成员函数:

 

map类的成员函数:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值