标准模板库,是一组模板类和函数,向程序员提供了 :
- 存储信息的容器
- 访问存储信息的迭代器
- 操作容器内容的算法
简单的来说,就是分为三部分,算法,迭代器,容器,其中迭代器是算法和容器之间的桥梁,可以让程序员可以通过算法对容器进行操作,而且这些算法也不是容器相关的,比如说reverse算法,对于多个容器都可以使用。本篇主要简单的介绍一下标准模板库(不包括C++11标准),如果想要系统的学习,还是需要去看相关书籍。
STL容器
容器是用于存储数据的STL类,容器大概分为2种:
- 顺序容器
- 关联容器
顺序容器:指的是容器内的数据是按照顺序存储的。顺序容器的插入速度较快,但是查找速度较慢。
顺序容器有:vector,deque,list
关联容器:指的是容器内的数据是按照键值对来存储的,或者说是指定的顺序来存储的,就像字典一样,关联容器的特点是,插入速度慢,但是读取速度快。
关联容器有:set,map,multiset,multimap
有些STL实现也支持hash_set,hash_multiset,hash_map,hash_multimap。这些容器有更好的搜索性能,搜索所需要的时间和容器的大小无关。但是,这些容器并不是遵循标准的容器,如果想要应用程序在不同的平台之间能够移植,还是需要遵循标准的容器。
string虽然操作和容器十分相似,但是由于string不能存取任意的数据类型,所以严格来说,还不能被称为容器。
选择正确的容器
容器 | 类型 | 优点 | 缺点 |
---|---|---|---|
std::vector | 顺序容器 | 在末尾插入数据快 可以像访问数组一样访问 | 调整大小时將影响性能 搜索时间与容器大小成正比 只能在末尾插入数据 |
std::deque | 顺序容器 | 具备vector的所有优点 还可以在头部插入数据 插入时间也是固定的 | 有vector的所有缺点 但与vector不同的是,根据规范,deque不需要支持reverse()函数。 |
std::list | 顺序容器 | 在list中间,开头,结尾插入数据,所需时间都是固定的 將元素从任意位置删除,所需要的时间也是固定的 插入或者删除元素后,指向其它元素的迭代器仍然有效 | 不能像数组那样用下标进行访问 搜索时间比vector要慢,因为list并不是存储在一块连续的内存空间中 搜索时间和list容器中的元素个数成正比 |
std::set | 关联容器 | 搜索时间比顺序容器快得多 | 插入时间比顺序容器慢 |
std::multiset | 关联容器 | 优点与set类似 在需要存储重复的元素时,可以使用multiset | 缺点与set类似 |
std::map | 关联容器 | 用于存取键值对的容器,并根据键来排序(map无法根据值来排序) 搜索速度不和元素个数成正比 | |
set::multimap | 关联容器 | 可以存储键相同的元素 优点和map类似 | 缺点与map类似 |
Detail: map容器是存储键值对的,只能按照键来排序,如果想要值来排序的话,有几种解决方案,1,新建一个map容器,將原来map里的键值对调换顺序存储到新的map容器中,当然,要保证逆序后的map键值都是唯一的,否则可以使用multimap。 2,新建一个set或者vector容器,把map里的每个键值对保存到新的set和vector里,然后自定义排序的函数对象进行排序。
STL迭代器
最简单的迭代器是指针,给定一个指向数组第一个元素的指针,可以递增该指针依次访问数组元素,当然,也可以操作指针所指向的元素。