STL详解

概念:

STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。

STL的代码从广义上讲分为三类:algorithm(算法)、Container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面的13个头文件:

<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。

STL共有六大组件

 1、容器。2、算法。3、迭代器。4、仿函数。5、迭代适配器 6、适配器。

  • 算法(Algorithm){是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个
  • list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用;
  • 算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。
  • <algorithm>是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,
  • 其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。
  • <numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。

    <functional>中则定义了一些模板类,用以声明函数对象}

  • 容器(Container),是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;
  • 迭代器(Iterator),提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象;
  • 仿函数(Function object,仿函数(functor)又称之为函数对象(function object),其实就是重载了()操作符的struct,没有什么特别的地方
  • 迭代适配器(Adaptor)
  • 空间配制器(allocator)其中主要工作包括两部分1.对象的创建与销毁    2.内存的获取与释放

序列式容器:
vector-数组,元素不够时再重新分配内存,拷贝原来数组的元素到新分配的数组中。
list-双链表。
deque-分配中央控制器map(并非map容器),map记录着一系列的固定长度的数组的地址.记住这个map仅仅保存的是数组的地址,真正的数据在数组中存放着.deque先从map中央的位置(因为双向队列,前后都可以插入元素)找到一个数组地址,向该数组中放入数据,数组不够时继续在map中找空闲的数组来存数据。当map也不够时重新分配内存当作新的map,把原来map中的内容copy的新map中。所以使用deque的复杂度要大于vector,尽量使用vector。
stack-基于deque。
queue-基于deque。
heap-完全二叉树,使用最大堆排序,以数组(vector)的形式存放。
priority_queue-基于heap。
slist-单向链表。

向量(vector) 连续存储的元素<vector>

列表(list)       由节点组成的双向链表,每个结点包含着一个元素<list>

双队列(deque) 连续存储的指向不同元素的指针所组成的数组<deque>

集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序<set>

多重集合(multiset) 允许存在两个次序相等的元素的集合 <set>

栈(stack) 后进先出的值的排列 <stack>

队列(queue) 先进先出的执的排列 <queue>

优先队列(priority_queue) 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列 <queue>

映射(map) 由{键,值}对组成的集合,以某种作用于键对上的谓词排列 <map>

多重映射(multimap) 允许键对有相等的次序的映射 <map>



关联式容器:
set,map,multiset,multimap-基于红黑树(RB-tree),一种加上了额外平衡条件的二叉搜索树。
hash table-散列表。将待存数据的key经过映射函数变成一个数组(一般是vector)的索引,例如:数据的key%数组的大小=数组的索引(一般文本通过算法也可以转换为数字),然后将数据当作此索引的数组元素。有些数据的key经过算法的转换可能是同一个数组的索引值(碰撞问题,可以用线性探测,二次探测来解决),STL是用开链的方法来解决的,每一个数组的元素维护一个list,他把相同索引值的数据存入一个list,这样当list比较短时执行删除,插入,搜索等算法比较快。
hash_map,hash_set,hash_multiset,hash_multimap-基于hash table。

 

容器的比较:

  Vector Deque List Set MultiSet Map MultiMap
内部结构 dynamic array array of arrays double linked list binary tree binary tree binary tree binary tree
随机存取 Yes Yes No No No Yes(key) No
搜索速度 很慢
快速插入移除 尾部 首尾 任何位置 -- -- -- --
迭代器:

常见的一些迭代器类型:iterator、const_iterator、reverse_iterator和const_reverse_iterator

只有顺序容器和关联容器支持迭代器遍历,各容器支持的迭代器的类别如下:

容器

支持的迭代器类别

说明

vector

随机访问

一种随机访问的数组类型,提供了对数组元素进行快速随机访问以及在序列尾部进行快速的插入和删除操作的功能。可以再需要的时候修改其自身的大小

deque

随机访问

一种随机访问的数组类型,提供了序列两端快速进行插入和删除操作的功能。可以再需要的时候修改其自身的大小

list

双向

一种不支持随机访问的数组类型,插入和删除所花费的时间是固定的,与位置无关。

set

双向

一种随机存取的容器,其关键字和数据元素是同一个值。所有元素都必须具有惟一值。

multiset

双向

一种随机存取的容器,其关键字和数据元素是同一个值。可以包含重复的元素。

map

双向

一种包含成对数值的容器,一个值是实际数据值,另一个是用来寻找数据的关键字。一个特定的关键字只能与一个元素关联。

multimap

双向

一种包含成对数值的容器,一个值是实际数据值,另一个是用来寻找数据的关键字。一个关键字可以与多个数据元素关联。

stack

不支持

适配器容器类型,用vector,deque或list对象创建了一个先进后出容器

queue

不支持

适配器容器类型,用deque或list对象创建了一个先进先出容器

priority_queue

不支持

适配器容器类型,用vector或deque对象创建了一个排序队列



参考博客:http://blog.youkuaiyun.com/u014744118/article/details/50727193

<think>我们正在回答用户关于STL(标准模板库)的详细解释和使用教程的问题。根据引用内容,STL是C++标准库的一部分,提供了一套通用的模板类和函数,用于处理数据结构和算法STL的核心包括容器、迭代器、算法和函数对象四个部分。我们将按照这些部分详细解释,并给出使用示例。注意:根据指令,行内数学表达式使用$...$,独立公式使用$$...$$,但由于本问题不涉及数学公式,我们主要关注代码示例和文字描述。同时,我们需要在回答末尾生成相关问题。步骤:1.介绍STL及其组成部分。2.分别详细说明容器、迭代器、算法和函数对象。3.给出一些代码示例(使用C++,因为STL是C++的库)。4.生成相关问题。引用说明:在回答中,我们会引用提供的引用内容,并在引用段落的末尾添加引用标识,例如[^1]。注意,我们引用的内容来自用户提供的引用[1]到[5]。由于用户要求使用中文回答,以下内容均为中文。</think>### STL(标准模板库)详解与使用教程 STL(Standard Template Library)是C++标准库的核心组成部分,提供了一套泛型、可重用的模板化组件,通过**容器**、**迭代器**、**算法**和**函数对象**四大模块实现高效编程[^2][^3]。以下是详细解析: --- #### 一、STL核心组件 1. **容器(Containers)** 用于存储和管理数据集合的模板类,分为两类: - **序列容器**:元素按线性顺序排列 - `vector<T>`:动态数组,支持随机访问 - `list<T>`:双向链表,高效插入/删除 - `deque<T>`:双端队列,首尾快速操作 - **关联容器**:基于键值组织的集合 - `set<T>`:唯一键集合,自动排序 - `map<Key, Val>`:键值对映射(键唯一) - `multiset<T>`/`multimap<Key,Val>`:允许重复键[^5] ```cpp #include <vector> #include <map> using namespace std; vector<int> nums = {3,1,4}; // 动态数组 map<string, int> ageMap = {{"Alice",25}, {"Bob",30}}; // 键值映射 ``` 2. **迭代器(Iterators)** 提供遍历容器的统一接口,行为类似指针: ```cpp for(vector<int>::iterator it = nums.begin(); it != nums.end(); ++it) { cout << *it << " "; // 输出:3 1 4 } ``` 3. **算法(Algorithms)** 通过`<algorithm>`头文件提供通用操作: ```cpp #include <algorithm> sort(nums.begin(), nums.end()); // 排序 → {1,3,4} auto pos = find(nums.begin(), nums.end(), 4); // 查找元素 ``` 4. **函数对象(Function Objects)** 可调用对象(如仿函数、Lambda表达式): ```cpp // 使用Lambda表达式排序 sort(nums.begin(), nums.end(), [](int a, int b){return a>b;}); ``` --- #### 二、关键特性与优势 1. **泛型编程** 模板机制使代码与数据类型解耦,例如`vector<int>`和`vector<string>`共享相同接口[^2]。 2. **零开销抽象** 编译时模板实例化确保运行时无额外性能损耗。 3. **组件协作** 迭代器作为容器与算法的桥梁: ```mermaid graph LR A[容器] --> B[迭代器] B --> C[算法] ``` --- #### 三、实用案例 **示例1:使用`vector`和`sort`** ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<double> values = {1.5, 3.2, 0.8}; sort(values.begin(), values.end()); // 升序排序 for(auto v : values) cout << v << " "; // 输出:0.8 1.5 3.2 return 0; } ``` **示例2:`map`快速查询** ```cpp #include <map> #include <string> using namespace std; map<string, string> capitals = { {"China","Beijing"}, {"Japan","Tokyo"} }; cout << capitals["Japan"]; // 输出"Tokyo" ``` --- #### 四、最佳实践指南 1. **容器选择原则**: - 随机访问需求 → `vector`/`deque` - 高频插入删除 → `list` - 键值查询 → `map`/`unordered_map` 2. **迭代器安全**: - 修改容器时避免迭代器失效(如`vector`插入后需重新获取迭代器) 3. **C++11新特性**: - 使用`auto`简化迭代器声明 - Lambda表达式替代仿函数 > STL通过13个核心头文件提供功能(如`<vector>`, `<algorithm>`, `<functional>`)[^4],掌握其设计哲学可显著提升代码质量和开发效率[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值