初识STL
标准模板库
- 广义:容器(container)、算法(algorithm)和迭代器(iterator)
- 容器和算法之间通过迭代器进行无缝衔接
- STL中几乎所有代码都采用模板类或模板函数
STL六大组件
- 容器
- 算法
- 迭代器
- 仿函数
- 适配器:一种用来修饰容器或仿函数或迭代器接口的东西
- 空间配置器:负责空间配置管理
容器
序列式容器:顺序存储,随机存取 如:vector,deque,list
关联式容器:随机存储,顺序存取 如:map
vector
可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素很慢,因为除了在尾部之外任意一次删除或插入都需要移动一些元素,添加元素还可能需要分配空间,从而移动所有元素到另一块空间
#include <vector>
#include <iostream>
#include <iterator>//迭代器头文件
#include <algoritm>//算法头文件
using namespace std;
void myPrint(int val)
{
cout << val << " ";
}
int main()
{
vector<int>v_int;
v_int.push_back(10);//尾部插入10
v_int.push_back(12);
v_int.pop();//删除尾部元素
v_int.push_back(11)
for(auto it = v_int.begin(); it != v_int.end(); it++)
cout<<*it<<" ";
cout<<endl;//输出结果是10 11
//利用算法遍历方式
for_each(v_int.begin(),v_int.end(),myPrint);
return 0;
}
vector数据结和数组非常类似,也称单端数组
vector区别于普通数组之处在于其可以动态地扩展空间
动态扩展空间并不是在原有基础上续接新空间,而是找更大的空间,然后将原来空间中的内容迁移到新空间,再释放原来的空间
vector的迭代器是支持随机访问的迭代器
互换容器
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int>v{1,2,3,4};
vector<int>u{5,6,7,8,9};
vector<int>(u).swap(v);//互换两个容器中的元素
//另外此处vector<int>(u)是一个拷贝v的匿名对象,当前行结束后马上就回收
for(int val:v)
cout<<val<<" ";
cout<<endl;
return 0;
}
deque
双端队列,其内部工作原理:
- deque内部有个中控器 ,维护每段缓冲区的内容,缓冲区中存放着真实的数据。
- 中控器维护的是每个缓冲区的地址,使得使用deque时像一段连续的空间
算法
质变算法:如:拷贝、删除
非质变算法:如:遍历
算法要通过迭代器才能访问容器,作用和指针类似