C++的 STL 是一个功能强大的库,它是建立在模板机制上,能够满足用户对存储管理不同类型数据的通用容器和施加在这些容器上的通用算法的巨大需求,并且具有完全的可移植性。因此在寻求程序的解决方案时,应该首先在 STL 中寻求恰当的容器和算法。 STL 是一个通用性极高的编程工具,这种通用性不仅表现在可以使用通用的容器存储和管理任意类型的数据,更重要的是可以对不同的容器施加统一通用的算法和操作。实现这种通用性的关键思想就是:通过引进一个间接层对象对不同结构的数据容器进行统一的访问操作,从而简化了对容器的操作,使得实现操作的算法和函数通用化。这种思想是 STL 的设计原则之一,也是软件设计中一个重要设计思想。 在 STL 中对容器访问的简化和独立就是通过循环子实现的,循环子可以无须依据某种特定容器的数据结构而完成对容器元素的访问,从而使得数据的存储结构与施加于数据的操作相互独立。标准模板库 STL 是由容器类模板,用于访问这些容器的循环子类模板和可以通过循环子在这些容器上实现的各种算法类模板以及函数类模板组成的。STL 为这种标准算法和函数(包括用户定义的函数)借助循环子在容器上实现的应用建立了统一的规则。 容器:可容纳各种数据类型的数据结构。 迭代器:可依次存取容器中元素的东西,连接容器和算法 算法:用来操作容器中的元素的函数模板。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象。 函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用。 比如,数组int array[100]就是个容器,而 int * 类型的指针变量就可以作为迭代器,可以为这个容器编写一个排序的算法 一、容器 (一)容器综述 标准库中定义了两种标准的容器: 1、序列容器(Sequence):向量 vector、表 list 和双向队列 deque。 vector:后部插入/删除,直接访问 2、关联容器 (Associative container) 映射 map、multimap 和集合 set、multiset。 set:快速查找,无重复元素 前两种合称为第一类容器。 3、序列转接器容器(又名容器适配器)(Sequence Adapter) 是一种可以改变函数对象或容器接口的组件。 序列转接器:堆栈 stack、队列 queue 和优先级队列priority_queue。 stack:LIFO 对象被插入容器中时,被插入的是对象的一个复制品。 4、预定义数组、字符串类 string、数值数组类 valarray 和位集合 bitset 均可以视为容器,但不是标准容器。标准容器的成员绝大部分都具有共同的成员名。, (1)类型成员
(2)循环子操作
(3)访问元素操作
front():返回容器中第一个元素的引用,back():返回容器中最后一个元素的引用。比如,查 list::front 的help,得到的定义是: reference front(); const_reference front() const; list有两个front函数 reference 和 const_reference 是typedef的类型 对于 list<double> , list<double>::reference 实际上就是 double & list<double>::const_reference 实际上就是 const double & 对于 list<int> , list<int>::refrence 实际上就是 int & list<int>::const_refreence 实际上就是 const int & (4)堆栈和队列操作
push_back(): 在容器末尾增加新元素 pop_back(): 删除容器末尾的元素 (5)表操作
(6)其他操作
(7)构造函数,析构函数
(8)分配操作
(9)关联操作
(10)标准容器的操作比较(复杂度)
表中各种容器所对应的表项的含义如下: ① 空表项:表示容器无此项操作。 ② const:表示容器此项操作的时间复杂度为常量。 ③ O(n):表示容器此项操作的时间复杂度与容器中元素个数n的线性相关。 ④ O(n)+:表示容器此项操作的时间复杂度与容器中元素个数n线性相关并且还需要增加一些附加操作时间花费。 ⑤ O(log(n)):表示容器此项操作的时间复杂度与容器中元素个数n对数相关。 ⑥ O(log(n))+:表示容器此项操作的时间复杂度与容器中元素个数n对数相关并且还需要增加一些附加操作时间花费。 ⑦ Ran:表示容器对应的循环子为随机访问循环子。 ⑧ Bi:表示容器对应的循环子为双向访问循环子。 |
|