STL基础知识
STL组成 | |
---|---|
容器 | 一些封装数据结构的模板类,例如 vector 向量容器、list 列表容器等。 |
算法 | STL 提供了非常多(大约 100 个)的数据结构算法,它们都被设计成一个个的模板函数,这些算法在 std 命名空间中定义,其中大部分算法都包含在头文件 中,少部分位于头文件 中。 |
迭代器 | 在 C++ STL 中,对容器中数据的读和写,是通过迭代器完成的,扮演着容器和算法之间的胶合剂。 |
适配器 | 可以使一个类的接口(模板的参数)适配成用户指定的形式,从而让原本不能在一起工作的两个类工作在一起。值得一提的是,容器、迭代器和函数都有适配器。 |
内存分配器 | 为容器类模板提供自定义的内存申请和释放功能,由于往往只有高级用户才有改变内存分配策略的需求,因此内存分配器对于一般用户来说,并不常用。 |
函数对象 | 如果一个类将 () 运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象(又称仿函数)。 |
迭代器
- 迭代器类别
随机访问迭代器 array/vector/deque
双向迭代器 list/set/multiset/map/multimap
前向迭代器 forward_list /unordered_map / unordered_multimap /unordered_set / unordered_multiset
不支持迭代器 stack / queue
- 迭代器定义方式、使用示例
//遍历 vector 容器。
#include <iostream>
//需要引入 vector 头文件
#include <vector>
using namespace std;
int main()
{
vector<int> v{1,2,3,4,5,6,7,8,9,10}; //v被初始化成有10个元素
cout << "第一种遍历方法:" << endl;
//size返回元素个数
for (int i = 0; i < v.size(); ++i)
cout << v[i] <<" "; //像普通数组一样使用vector容器
cout << endl << "第二种遍历方法:" << endl;
//迭代器定义示例
//创建一个正向迭代器
vector<int>::iterator i;
//创建一个常量正向迭代器
vector<int>::const_iterator i;
//创建一个反向迭代器
vector<int>::reverse_iterator i;
//创建一个常量反向迭代器
vector<int>::const_reverse_iterator i;
// 常量迭代器不可修改元素
//用 != 比较两个迭代器
for (i = v.begin(); i != v.end(); ++i)
cout << *i << " ";
cout << endl << "第三种遍历方法:" << endl;
for (i = v.begin(); i < v.end(); ++i) //用 < 比较两个迭代器
cout << *i << " ";
cout << endl << "第四种遍历方法:" << endl;
i = v.begin();
while (i < v.end()) { //间隔一个输出
cout << *i << " ";
i += 2; // 随机访问迭代器支持 "+= 整数" 的操作
}
}
容器
- array
特点:比普通数组更安全,无法动态扩展或者收缩
#include <array>
// 创建具有 10 个 double 类型元素的 array 容器
std::array<double, 10> values;
// 初始化
std::array<double, 10> values {};
std::array<double, 10> values {0.0, 0.0, 0.1};
// 成员函数
values.begin(); // 返回指向第一个元素的迭代器
values.end(); // 返回指向容器最后一个元素的后一个位置的迭代器
values.at(i); // 返回容器中 i 位置处元素的引用
values.front(); // 第一个元素的直接引用
values.back(); // 最后一个元素的直接引用
values.data(); // 返回容器首个元素的指针
values.fill(1); // 容器填满元素1
values.empty(); // 是否为空
values.size(); // 当前元素的数量
values.max_size(); // 最大容量
array1.swap(array2); // 交换 array1 和 array2 容器中的所有元素,但前提是它们具有相同的长度和类型
- vector
特点:动态数组,可以进行元素的插入和删除,动态调整内存
#include <vector>
// 创建具有 10 个 double 类型元素的 vector容器
std::vector<int> values;
values.reserve(20);//调用 reserve() 不会影响已存储的元素,也不会生成任何元素,只是设置容量,即最少容纳20元素
// 初始化
std::vector<int> values{2, 3, 5, 7, 11, 13, 17, 19}; //
std::vector<int> values(20);//容量为20
std::vector<int> values(20, 1);//容量为20,且20个元素都是1
// 成员函数
values.capacity(); // 当前元素的数量
values.shrink_to_fit(); // 将内存减少到等于当前元素实际所使用的大小。
values.push_back() //在序列的尾部添加一个元素。
values.pop_back() //移出序列尾部的元素。
insert() 在指定的位置插入一个或多个元素。
erase() 移出一个元素或一段元素。
clear() 移出所有的元素,容器大小变为 0。
swap() 交换两个容器的所有元素。
emplace() 在指定的位置直接生成一个元素。
emplace_back() 在序列尾部生成一个元素。
resize() 改变实际元素的个数。
- deque
特点:双端队列容器,deque 容器中存储元素并不能保证所有元素都存储到连续的内存空间中,当需要向序列两端频繁的添加或删除元素时,应首选 deque 容器。
#include <deque>
// 创建具有 10 个 double 类型元素的 vector容器
std::vector<int> values;
values.reserve(20);//调用 reserve() 不会影响已存储的元素,也不会生成任何元素,只是设置容量,即最少容纳20元素
// 初始化
std::vector<int> values{2, 3, 5, 7, 11, 13, 17, 19}; //
std::vector<int> values(20);//容量为20
std::vector<int> values(20, 1);//容量为20,且20个元素都是1
// 成员函数
values.capacity(); // 当前元素的数量
values.shrink_to_fit(); // 将内存减少到等于当前元素实际所使用的大小。
values.push_back() //在序列的尾部添加一个元素。
values.pop_back() //移出序列尾部的元素。
insert() 在指定的位置插入一个或多个元素。
erase() 移出一个元素或一段元素。
clear() 移出所有的元素,容器大小变为 0。
swap() 交换两个容器的所有元素。
emplace() 在指定的位置直接生成一个元素。
emplace_back() 在序列尾部生成一个元素。
resize() 改变实际元素的个数。
```,可以进行元素的插入和删除,动态调整内存
```cpp
#include <vector>
// 创建具有 10 个 double 类型元素的 vector容器
std::vector<int> values;
values.reserve(20);//调用 reserve() 不会影响已存储的元素,也不会生成任何元素,只是设置容量,即最少容纳20元素
// 初始化
std::vector<int> values{2, 3, 5, 7, 11, 13, 17, 19}; //
std::vector<int> values(20);//容量为20
std::vector<int> values(20, 1);//容量为20,且20个元素都是1
// 成员函数
values.capacity(); // 当前元素的数量
values.shrink_to_fit(); // 将内存减少到等于当前元素实际所使用的大小。
values.push_back() //在序列的尾部添加一个元素。
values.pop_back() //移出序列尾部的元素。
insert() 在指定的位置插入一个或多个元素。
erase() 移出一个元素或一段元素。
clear() 移出所有的元素,容器大小变为 0。
swap() 交换两个容器的所有元素。
emplace() 在指定的位置直接生成一个元素。
emplace_back() 在序列尾部生成一个元素。
resize() 改变实际元素的个数。
- list
- pair
- map、unordered_map
- set、unordered_set
- mutiset、unordered_mutiset
适配器
容器适配器
- stack
- queue
- priority_queue
迭代器适配器
- reverse_iterator
- insert_iterator
- istream_iterator、ostream_iterator
- streambuf_iterator
- move_iterator
算法
- sort()排序函数
- stable_sort()
- find()函数