STL
什么是STL
STL(Standard Template Library),即标准模板库,STL的一个重要特点是数据结构与算法的分离。另一个重要特性是STL不是面向对象的。
STL的六大组件
-
容器(Container),是一种数据结构,如list,vector,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;
-
迭代器(Iterator),提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象;
-
算法(Algorithm),是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用;
-
仿函数(Functor)
-
适配器(Adaptor)
-
分配器(allocator)
算法头文件
#include <algorithm>
sort
sort(a, a+n);
//地址a 到a+n之间的内容排序,默认升序
reverse
reverse(a, a+n);
//数组翻转.
容器有以下六大类
还有一些变式
vector
//初始化
vector<int> v;
vector<int> v(100); //暂时开辟一百个内存
vector<int> v(100, 0); //初始声明100个元素全为0
v.front(); // 求向量首元素
v.back(); // 求向量尾元素
v.push_back; // 往尾部添加元素
v.pop_back(); //删除尾部元素
v.size(); // 求向量元素个数
v.empty(); // 判断向量是否为空
stack
先进后出、栈顶删除、栈顶加入
stack<int> myStack; //初始化栈
myStack.push(x); //栈顶元素入栈
myStack.pop(x); // 栈顶元素出栈
myStack.top(); //求栈顶元素
myStack.empty(); // 判断栈是否为空
myStack.size(); //求栈的大小
queue
queue<int> q; //初始化队列
q.front(); //求队头元素
q.back(); //求队尾元素
q.push(value); // 队尾插入元素
q.pop(); // 队头删除元素
q.empty(); // 判断是否为空
q.size(); // 求队列元素个数
双端队列
在队列的基础上可在两端进出
deque<int> deq; //初始化双端队列
deq.front(); // 求队头元素
deq.back(); // 求队尾元素
deq.push_back(value); // 队尾添加元素
deq.push_front(value);// 队头添加元素
deq.pop_front(); // 队头删除元素
deq.pop_back(); // 队尾删除元素
deq.empty(); // 判断队列是否为空
deq.size(); // 求队列元素个数
优先队列(priority_queue)
随意插入
优先权最高的先出,定义一个优先权规则,插入自动按照优先权进行排序,每次弹出优先权最高的元素。
STL 默认设优先权最大为值最大。
完全平衡红黑树
priority_queue<int>pq; //初始化优先队列
pq.top(); // 求优先权最高的元素
pq.pop(); // 优先权最高的元素出队
pq.push(value); //向队列添加元素
pq.empty(); //判断队列是否为空
pq.size(); //求队列元素个数
string
声明字符串 string s;
求字符串长度 s.length();
求字符串字串
s.substr(begin, length); //begin开始位置,length是字串长度
s.substr(begin); //从begin开始到结尾
s.
字符串连接 可以用==、<、>、!=、>=、<=
字符串比较 可以用==、<、>、!=、>=、<=
集合
数学中:确定性、互异性、无序性
STL: 确定性、互异性、有序性(自动升序)
set <int> st; // 初始化集合
st.insert(value); // 插入元素
st,erase(value); // 删除元素
st.count(value); // 查询元素,返回类型bool
st.empty(); // 判断集合是否为空
st.clear(); // 集合清空
map
set: 确定性、互异性、有序性
map: 确定性、 互异性、有序性
特点:可携带另一个值
map<key, value> mp; //初始化
mp.insert(); // 插入元素
mp.eraze(); // 删除元素
mp.count(value); // 查询是否有键值value
mp.empty(); // 判断是否为空
mp.clear(); // 清空
multiset
多重集合
multiset 确定性、有序性、可重复
与set的区别在于元素可以重复
multiset<int> mst; //初始化多重集
mst.insert(value); // 插入
mst.eraze(); // 集合删除元素
mst.count(value); // 查询value是否存在
mst.empty(); // 判断是否为空集
mst.clear(); //集合清空
迭代器
遍历
以vector为例
vector<int> V;
vector<int>:: iterator;
for (iterator = V.begin(); iteartor != V.end(); iterator++)