文章目录
-
STL就是标准模板库(Standard Template Library), 它提供了模板化的通用类和通用函数
-
STL的核心内容包括容器、迭代器、算法三部分内容,三者常常协同工作,为各种编程问题提供有效的解决方案
-
STL提供了许多可直接用于程序设计的通用数据结构和能强大的类与算法,是程序设计者的一个巨大宝藏。程序员可以在STL中找到各种常用的数据结构和算法,这些数据结构和算法是准确而有效的,用它们来解决编程中的各种问题,可以减少程序测试时间,写出高质量的代码,提高编程效率
容器
- 容器是用来存储其它对象的对象
- 容器是容器类的实例,而容器类使用类模板实现的,适用于各种数据类型
- STL的容器常被分为顺序容器、关联容器和容器适配器三类
- 顺序容器常被称为序列容器,它是将相同类型对象的有限集按顺序组织在一起的容器,用来表示线性数据解结构,C++提供的顺序类型容器有向量(vector)、链表(list)、双端队列(deque);
- 联容器是非线性容器,是用来根据键(key)进行快速存储、检索数据的容器。这类容器可以存储值的集合或键值对,C++中的关联容器主要包括集合(set)、多重集合(multiset)、映射(map)、多重映射(multimap)
- 容器适配器主要指堆栈(stack)和队列(queue),它们实际是受限制访问的顺序容器类型
- STL库中十大容器
| ** STL容器名** | 说明 |
|---|---|
| vector | 向量,从后面快速插入和删除,直接访问任何元素 |
| list | 双向链表 |
| deque | 双端队列 |
| set | 元素不重复的集合 |
| multiset | 元素可重复的集合 |
| stack | 堆栈,先进后出 |
| map | 一个键只对应一个值得映射 |
| mutimap | 一个键可对应对个值得映射 |
| queue | 队列,先进先出 |
| priority_queue | 优先级队列 |
- STL是经过精心设计的,为了减小操作使用容器的难度,大多数容器都提供了相同的成员函数,如下表所示:
| 成员函数 | 说明 |
|---|---|
| 默认构造函数 | 对容器进行默认初始化的构造函数,常有多个,用于提供不同的容器初始化方法 |
| 拷贝构造函数 | 用于将容器初始化为同类型的现有容器的副本 |
| 析构函数 | 执行容器销毁时的清理工作 |
| empty() | 判断容器是否为空,为空返回true |
| max_size() | 返回容器的最大容量 |
| size | 返回容器中当前元素的个数 |
| operator= | 将一个容器赋给另一个同类容器 |
| operator< | 如果第一个容器小于第二个容器,返回true |
| operator<= | 如果第一个容器小于等于第二个容器,返回true |
| operator> | 如果第一个容器大于第二个容器,返回true |
| operator>= | 如果第一个容器大于等于第二个容器,返回true |
| swap | 交换两个容器中的元素 |
vector
- vector 容器是STL中最常用的容器之一, vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整所占用的内存空间,整个过程无需人工干预。
- vector 容器以类模板 vector( T 表示存储元素的类型)的形式定义在头文件中,并位于 std 命名空间中。因此,在创建该容器之前,代码中需包含如下内容:
cpp
#include <vector>
using namespace std;
- 创建向量容器的方式
cpp
//创建空的向量容器
vector<double> values;
values.reserve(20);
//指定初始值以及元素个数
vector<int> primes {2, 3, 5, 7, 11, 13, 17, 19};
//创建 vector 容器时,指定元素个数
vector<double> values(20); //有 20 个元素,它们的默认初始值都为 0。
vector<double> values(20, 1.0); //有 20 个元素,它们的默认初始值都为 1.0。
//通过存储元素类型相同的其它 vector 容器,创建新的 vector 容器
vector<char> value1(5, 'c');
vector<char> value2(value1);
- 编程示例
cpp
#include <iostream>
#include <vector>
using namespace std;
void display(vector<int> &v){
while(!v.empty()){
cout << v.back() << " ";
v.pop_back();
}
cout << endl;
}
int main(void){
vector<int> v1;
// 增加容器的容量
v1.reserve(10);
// 返回当前容量
cout << v1.capacity() << endl;
display(v1);
vector<int> v2(100);
cout << v2.capacity() << endl;
vector<int> v3(10,3);
v3.insert(v3.begin(), 1111);
display(v3);
return 0;
}
list
- list 容器,又称双向链表容器,即该容器的底层是以双向链表的形式实现的。这意味着,list 容器中的元素可以分散存储在内存空间里,而不是必须存储在一整块连续的内存空间中

- list 容器以模板类 list(T 为存储元素的类型)的形式在头文件中,并位于 std 命名空间中。因此,在使用该容器之前,代码中需要包含下面两行代码:
cpp
#include <list>
using namespace std;
- list容器的创建
cpp
list<int> values; //没有任何元素
list<int> values(10); //包含 10 个元素每个元素的值都为相应类型默认值(int类型默认值为 0)
list<int> values(10, 5);//包含 10 个元素并且值都为 5 。
list<int> value2(values); //和values元素个数、内容相同
//拷贝普通数组,创建list容器
int a[] = { 1,2,3,4,5 };
std::list<int> values(a, a+5); //values中5个元素,分别为 1 2 3 4 5
stack
- STL 提供了 3 种容器适配器,分别为 stack 栈适配器、queue 队列适配器以及 priority_queue 优先权队列适配器
- 容器适配器本质上还是容器,只不过此容器模板类的实现,利用了大量其它基础容器模板类中已经写好的成员函数。要使用STL中的堆栈容器,代码中需要包含下面两行代码:
cpp
#include <stack>
using namespace std;
- STL中提供堆栈容器的主要操作如下:
- push(), 将一个元素加入stack内,加入的元素放在栈顶
- top(), 返回栈顶元素的值
- pop(), 删除栈顶元素
cpp
#include <iostream>
#include <stack>
using namespace std;
int main(void){
stack<int> s;
s.push(10);
s.push(20);
s.push(30);
cout << s.top() << endl; //30
s.top() = 100;
s.push(40);
s.push(50);
s.pop(); //弹栈 50
while(!s.empty()){
cout << s.top() << endl; //40 100 20 10
s.pop();
}
cout << endl;
return 0;
}