STL
建立数据结构与算法的一套标准,降低程序间耦合性关系,提升各自的独立性,弹性,交互操作。是一门以泛型思维为基础系统化的调理分明的软件组件分类学,可以可以看成软件组件库
STL 常规功能
基础的
- 可被赋值的
- 不需要任何参数就可以构造的
- 可判断是否等同的
- 可比较大小的
- 正规的
进阶功能
- 具有输入功能的迭代器
- 具有输出功能的迭代器
- 单项迭代器
- 双向迭代器
- 随机存储迭代器
- 一元函数
- 二元函数
- 传回真假值得一元判断式
- 传回真假值得二元判断式
更高阶功能
- 序列容器
- 关联容器
实现时完成抽象概念加以系统化
通俗的描述STL
STL 实现的是依据泛型思维假设起来的一个概念结构,这个以抽象概念为主体而不是 以实际类为主体的结构形成一个严谨的接口标准,在此接口下任何组件都有最大的独立性
并且以迭代器胶合起来
以配置器相互配接
或者以仿函数动态选择某种策略
STL 六大组件
容器 containers
使用各种数据结构存放数据
使用上 vector、list、deque、set 、map 等
实现上是 一种模板类 template class
算法 algorithms
使用上 sort 、search 、copy 、erase
实现上是一种函数模板 function template
迭代器 iterators
扮演容器与算法之间的胶合剂,是所谓的泛型指针,有五种类型,以及所衍生的变化
实现的角度看 operator* 、operator->、operator++、operator-- 指针相关操作予以重载的类模板
所有STL 容器都附带有自己专属的迭代器,但是只有容器设计者才知道如何遍历自己的元素
注:原生指针也是一种迭代器 native pointer
仿函数 functor
行为类似函数,可以当做算法得某种执行策略
实现上:是一种重载了 operator () 的类 或 class template
一般函数指针可以视为狭义的仿函数
配接器 adapters
是一种用来修饰 容器containers、仿函数 functor 、迭代器 iterator 接口的东西
使用上 queue 和 stack 虽然看似容器 实际上,只能算作配接器,因为底层借助 deque ,所有操作都由 deque供应
使用上:
改变 functor 的 称为 functor adapter
改变 container 的称为 container adapter
改变 iterator 的称为 iterator adaoter
配置器 allocators
负责空间配置与管理
从实现的角度 :配置器是实现了
动态空间配置
空间管理
空间释放的 class template
注: 在使用STL 时 应按照C++ 标准使用无扩展名的头文件
六大组件间关系
容器contianer 通过 配置器 alllocators 取得数据存储的空间
算法algorithm 通过迭代器 iterator 存取 容器 contianer 的内容
仿函数 functor 可以协助 algorithm 完成不同的策略变化
配接器 adapter 可以修饰或套结 仿函数functor
配接器 adapter 可以修饰 容器 contianer 、迭代器 iterator
STL 版本
H P 版本 始祖版本
P.J. Plauger 实现版本
Pouge Wave 实现版本
STLport 实现版本
SGISTL 实现版本
gcc 中采用的SGI STL 实现
SGI STL 被gcc 采用 可以在 gcc include 找到所有stl 头文件
SGI STL 文件分布
- C++ 标准规范下的C头文件(无扩展名)
例:cstdio,cstdlib,cstring等 - C++ 标准程序库中不属于STL 范畴者
例如:stream,string等 - STL 标准头文件(无扩展名)
例如:vector,deque,list,map,algorithm,functional等 - C++ standard (C++标准)定案前 HP 所规范的STL 头文件
例如:vector.h, deque.h , list.h ,map.h , algo.h function.h 等 - SGI STL 内部文件(STL 真正实现的位置)
例如:stl_vector.h ,stl_deque.h , stl_list.h, stl_map.h , stl_algo.h、stl_function.h
STL 标准头文件 对应内部实现文件
- algorithm -> stl_algoruthm.h
- daque -> stl_deque.h
- functional -> stl_function,h
- hash_map -> stl_hash_map.h
- hash_set -> stl_hash_set.h
- iterator -> stl_iterator.h
- list -> stl_list.h
- map-> stl_map.h
- memory -> 定义 auto_ptr , 包含
stl_algobase.h
stl_alloc.h
stl_construct.h
str_tempbuf.h
stl_uninitialized.h
stl_raw_storage_iter.h - numeric -> stl_numeric.h
- pthread_alloc ->与Pthread 相关 node allocator
- queue -> stl_queue.h
- rope -> stl_rope.h
- set -> stl_set.h
- slist ->stl_slist.h
- stack -> slt_stacl.h
- utility -> stl_relops.h stl_pair.h
- vector -> stl_vector.h
SGI STL 内部私用文件功能
- stl_algo.h
算法(数值类型除外) - stl_algobase.h
基本算法:swap , min , max , copy , copy_backward ,copy_n ,fill ,fill_n, mismatch , equal , lexicographical_compare - stl_alloc.h
空间配置器 std::alloc - stl_bvector.h
bit_vector - stl_config.h
针对各家编译器特性定义各种环境变量 - stl_construct.h
构造/析构 基本工具 construct() destory() - std_deque.h
双向开口的队列 - stl_function.h
函数对象 或 仿函数 - stl_hash_fun.h
hash function
杂凑函数(哈希函数) 用于hash_table - stl_hash_map.h
用hast-table 完成的map , multimap - stl_hash_set .h
用哈希表 hash-table 完成的 set , multiset - stl_hashtable.h
hash-table 哈希表 - stl_heap .h
heap 堆算法:push_heap , pop_heap , make_heap , sort_heap - stl_iterator.h
迭代器及其相关配接器,并定义迭代器
advance , distance - stl_list.h
单项 双向 链表 - stl_map
映射表 - stl_mulitmap.h
多键映射表 - stl_mulitset.h
多键集合 - stl_numeric.h
数组算法
accumulate
inner_product
partial_sum
adjacent_difference
power
iota - stl_pair.h
成对组合 - stl_queue.h
队列
priority_queue 高权先行队列 - stl_raw_storage_iter.h
定义一种输出迭代器 - stl_relops.h
定义四个运算符重载
operator!= , operator> , operator<= , operator>= - stl_rope.h
大量 大规模字符串 - stl_set.h 集合
- stl_slist.h single list 单向穿行链表
- stl_stack.h 堆栈
- stl_tempbuff.h
temporary_buffer class 在 算法 stl_algo 中使用 - stl_tree.h 红黑树
- stl_uninitialized.h
内存管理工具
uninitialized_copy
uninitialized_fill
uninitialized_fill_n - stl_vector 向量容器