STL(Standard Template Library),名为标准模板库,是C++标准库的一部分,故不需要单独安装。
提出STL的主要目的就是将数据结构、操作与算法分离,并提供常见的数据结构、操作与算法,简化开发流程。
STL由容器、算法、迭代器、函数对象(仿函数)、适配器与内存分配器这6部分组成。这6部分中的后面4部分为容器和算法服务。
名称 | 功能 |
容器 | 封装了数据结构的模板类。例如vector。 |
算法 | 大部分包含在头文件 |
迭代器 | 提供对容器的读与写的功能,连接容器与算法。 |
函数对象 | 若一个类将()运算符重载为成员函数,那么这个类就被称为函数对象类,这个类的对象就是函数对象(仿函数)。 |
适配器 | 将一个类的接口(模板的参数)适配为用户的指定形式,从而让原本不能衔接的类衔接成功来一起工作。容器、迭代器和函数都有适配器。 |
内存分配器 | 为容器类模板提供自定义的内存申请和释放功能。 |
STL不是面向对象的,而是体现了泛型程序设计的思想。
常见的容器如下:
用法 | 功能 |
vector |
定义一个名为v1,元素类型为T的空vector |
vector 或 vector |
用v2中的元素初始化v1 |
vector |
v3中包含n个值为val的元素 |
vector |
v3中包含了n个默认值初始化的元素 |
vector |
使用 a, b, c... 初始化 v5 |
vector |
二维数组初始化 |
用法 | 功能 |
v.empty() | 如果v为空则返回true,否则返回false |
v.size() | 返回v中元素的个数 |
v.push_back(val) | 向vector的尾端添加值为val的元素。 |
v.pop_back(val) | 删除尾元素,返回void。 |
v.back() | 返回v中最后一个元素的引用。 |
v.front() | 返回v中第一个元素的引用。 |
v[n] | 返回v中第n个位置上元素的引用,不能用下标操作添加元素。 |
v1 = v2 | 用v2中的元素替换v1中的元素 |
v1 = {a, b, c...} | 用元素 {a, b, c...} 替换v1中的元素 |
v1 == v2 | 当且仅当拥有相同数量且相同位置上值相同的元素时,v1与v2相等。 |
v1 != v2 | 不满足相等就是不等。 |
<, <=, >, >= | 以字典序进行比较。 |
若将指针理解为元素的地址,那么迭代器可以理解为元素的索引。
迭代器提供了对容器的间接访问。
一个迭代器的范围可表示为[a.begin(),a.end())。begin返回指向第一个元素的迭代器,end返回指向容器最后一个元素的下一位置的迭代器。迭代器的范围对于访问容器二言是一个左闭右开区间。
下面程序展示了vector的迭代器的用法。
#include
#include
int main(void)
{
std:: vector< int > a{1,2,3,4,5};
auto it = a.begin();
while(it != a.end())
{
std::cout << *it << std:: endl;
it++;
}
return 0;
}
结果:
函数 | 功能 |
begin() | 获得指向第一个元素的迭代器。 |
end() | 获得指向尾元素后面位置的迭代器。 |
insert(p,n,val) | 在迭代器p前插入n个值为val的元素,返回新添加的第一个元素的迭代器。 |
erase(p) | 删除迭代器p指向的元素,返回指向被删除元素的下一个元素的迭代器。 |
erase(b,e) | 删除迭代器b与迭代器e间的所有元素,返回指向最后一个被删除元素的下一个元素的迭代器。 |
函数 | 功能 |
sort(a.begin(), a.end(),比较函数[可选]) | 按输入序列的字典序升序排序,原位操作,无返回值。 |
unique(a.begin(), a.end()) | 消除输入序列的相邻的重复项,返回一个指向无重复值范围末尾的迭代器。 |
reverse(a.begin(), a.end()) | 将输入序列按照下标逆序排列,原位操作,无返回值。 |
函数 | 功能 |
max_element(a.begin(), a.end()) | 返回指定范围内的最大值的迭代器。 |
min_element(a.begin(), a.end()) | 返回指定范围内的最小值的迭代器。 |
distance(x,y) | 返回迭代器x与迭代器y间的距离。 |
函数 | 功能 |
v.resize(n,t) | 调整v的大小为n个元素,新添加的元素初始化为t值。 |
map提供一对一的哈希。
map中的每个元素有两个属性,第一个是关键字(key),第二个是值(value),每个关键字只能在map中出现一次,且每个关键字都关联一个值,组成了键-值对。map的内部实现是一颗红黑树。
用法 | 功能 |
map |
定义一个名为name的map,其键类型为k_type,值类型为value_type。 |
函数 | 功能 |
begin() | 返回指向map头部的迭代器。 |
end() | 返回指向map末尾的迭代器。 |
empty() | 如果map为空则返回true。 |
clear() | 删除所有元素。 |
size() | 返回map中元素的个数。 |
rbegin() | 返回一个指向map尾部的逆向迭代器。 |
rend() | 返回一个指向map头部的逆向迭代器。 |
swap() | 交换 2 个 map 容器中存储的键值对,这意味着,操作的 2 个键值对的类型必须相同。 |
find(key) | 在 map 容器中查找键为 key 的键值对,如果成功找到,则返回指向该键值对的双向迭代器;反之,则返回和 end() 方法一样的迭代器。另外,如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
lower_bound(key) | 返回一个指向当前 map 容器中第一个大于或等于 key 的键值对的双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
upper_bound(key) | 返回一个指向当前 map 容器中第一个大于 key 的键值对的迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
equal_range(key) | 该方法返回一个 pair 对象(包含 2 个双向迭代器),其中 pair.first 和 lower_bound() 方法的返回值等价,pair.second 和 upper_bound() 方法的返回值等价。也就是说,该方法将返回一个范围,该范围中包含的键为 key 的键值对(map 容器键值对唯一,因此该范围最多包含一个键值对)。 |
count(key) | 在当前 map 容器中,查找键为 key 的键值对的个数并返回。注意,由于 map 容器中各键值对的键的值是唯一的,因此该函数的返回值最大为 1。 |
at(key) | 找到 map 容器中 key 键对应的值,如果找不到,该函数会引发 out_of_range 异常。 |
方法 | 功能 |
insert(pair |
向map中插入键为key_content、值为value_content的键值对。 |
emplace(key_content, value_content) | 向map中插入键值对。 |
name[key_content]=value_content | 用类似索引的方式插入 |
该关键字的功能就是,根据后面的值来推测前面的类型是什么。
注意点:
使用一个共享变量来记录指针管理的对象被引用了几次。当引用计数为0时,说明该对象没有被引用,自动回收内存。
用std::make_shared创建。
该指针要求它管理的对象只能有一次引用,当引用计数为0时,自动回收内存。
用std::make_unique创建。
[1]C++之STL(标准模板库)介绍_vector::_m_range_check-CSDN博客
[2]C++ 数组(vector)常用操作总结_vector操作-CSDN博客
[3]C++ map用法总结(整理)_c++map用法-CSDN博客
[4]C++ STL map容器详解 (biancheng.net)
[5]C++ 介绍 - USTC 编译原理和技术 2023 (ustc-compiler-principles.github.io)