标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽说它主要表出现到C++中,但在被引入C++之前该技术就已经存在了很长时间。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用。
一、vector(向量)
//变长数组,倍增的思想,定义在<vector>,底层为顺序表(数组)
注:系统为某一程序分配空间时,所需时间与空间大小无关,与申请次数有关
std::vector<T> vec; | 创建T类型元素的vector容器 |
int size()const | 返回元素个数 |
bool empty() | 返回是否为空,如果空返回true,否则返回false |
void clear() | 清空 |
ref front()/back() | 返回第一个/最后一个元素的引用 |
iterator begin()/end() | 返回指向容器中第一个元素/最后一个元素位置后一位置的迭代器 |
void push_back(const T& x)/pop_back() | 在序列尾部添加/删除一个元素 |
iterator insert(iterator it,const T&x) | 向量中迭代器指向元素前增加一个元素x |
iterator erase(iterator it) | 删除向量中迭代器指向元素 |
iterator erase(iterator first,iterator last) | 删除向量中[first,last)中元素 |
operator[] | 重载了[]运算符,支持像数组一样的随机存取 |
支持比较运算,按字典序
//遍历向量
for(int i=0;i<vec.size();i++)//下标访问
cout<<vec[i];
vector<int>::iterator it;//可以只用auto
for(it=vec.begin();it!=vec.end();it++C)//迭代器访问tt
cout<<*it;
for(auto t:vec)//自动访问,C++11新增特性,在C++14中还允许for(t:vec)
cout<<t;
二、pair(对)
//关联式容器,键值对,定义在<utility>
pair<T1,T2>p(); | 创建T类型元素的pair容器 |
first/second | 第一/二个元素 |
pair1.swap(pair2) | 交换 pair1 和 pair2 的键值对 |
支持<、<=、>、>=、==、!=运算,以first为第一关键字,以second为第二关键字(字典序)
三、string(字符串)
//定义在<string>
string s | 创建字符串对象 |
int size()/length() | 返回字符串长度 |
bool empty() | 判断是否为空 |
void clear() | 清空字符串 |
const char* c_str() | 返回字符串所在字符数组的起始地址 |
string& insert (size_t pos, const string& str); | 在 string 字符串中pos位置(下标)插入str |
string& erase (size_t pos = 0, size_t len = npos); | 删除 string 中的一个起始下标pos,len长度的子串 |
string substr (size_t pos = 0, size_t len = npos) const; | pos为提取子串的起始下标,len为提取子串长度 |
size_t find (const string& str, size_t pos = 0) const; size_t find (const char* s, size_t pos = 0) const; | str为待查找的子串,pos为开始查找的位置(下标) |
int find_first_of(const string& str) | 查找子串和主串公共字符在主串中首次出现的位置 |
//重载>> << [] + +=
cout<<str;
cin>>str;
str[i];
str1+str2/str1+=str2;
四、queue(队列)
//定义在<queue>
std::queue<T>que() | 创建T类型元素的queue容器,()初始化 |
queue(const queue &que); | 拷贝构造函数 |
bool empty() | 判空 |
void push(const T& x) | 在queue尾部添加一个元素引用 |
void pop() | 删除队首元素 |
T& front() | 返回queue队首元素引用 |
T& back() | 返回queue队尾元素引用 |
五、priority_queue(优先队列,默认是大根堆)
//定义在<queue>
std::priority_queue<T>p_que | 创建T类型元素的priority_queue容器 |
priority_queue(const p_queue &que); | 拷贝构造函数 |
int size() | 返回元素个数 |
bool empty() | 判空 |
void push(T x)/(T&& x) | 根据既定的排序规则,将元素 obj 的副本存储/移动到 priority_queue 中适当的位置。 |
T& top() | 返回 priority_queue 中第一个元素的引用 |
void pop() | 弹出队首元素 |
priority_queue<int,vector<int>,greater<int>>q;//定义成小根堆的方式
六 、deque(双端队列)
//定义在<deque>,底层为循环队列
deque<T>dque | 创建T类型元素的deque容器 |
int size() | 返回元素个数 |
bool empty() | 判空 |
void clear() | 清空 |
ref front()/back() | 返回队首/队尾元素引用 |
void push_back(T x)/pop_back(T x) | 弹出队头/队尾元素 |
void push_front(T x)/T pop_front(T x) | 插入x到队头/队尾 |
iterator begin()/end() | 返回指向容器中第一个元素/最后一个元素位置后一位置的迭代器 |
opreator[] | 随机存取 |
七、stack(栈)
//定义在<stack>
stack<T>stk | 创建T类型元素的stack容器 |
int size() | 返回元素个数 |
bool empty() | 判空 |
void push(T x) | 从栈顶插入元素 |
void pop() | 弹出栈顶元素 |
T top() | 返回栈顶元素 |
八、set(集合),multiset(允许元素重复),unordered_set(未排序的集合),unordered_multiset
//定义在<set><unordered_set>,s基于平衡二叉树(红黑树),动态维护有序序列,us基于哈希表
int size() | 返回元素个数 |
void empty() | 判重 |
void clear() | 清空 |
iterator begin()/end() | 返回指向容器中第一个元素/最后一个元素位置后一位置的迭代器 |
operator++ -- | 返回前驱和后继,时间复杂度O(logn) (ordered) |
void insert(const T& x) | 插入x |
iterator find(T x) | 查找x,返回指向x的双向迭代器 |
int count(T x) | 返回x的个数 |
void erase(T x)/(iterator it) | 删除所有x O(k+logn)/删除it |
lower_bound(T x)/upper_bound(T x) | 返回>=x/>x的最小数的迭代器(ordered) |
注:unordered_set 增删改查的时间复杂度是O(1)
for(set<int>::iterator it=st.begin();it!=st.end();it++)//遍历set
cout<<*it<<" ";
九、map(散列表),multimap(一key对多value),unorder_map(未排序的散列表),unordered_multimap
//定义在<map><unordered_map>,底层红黑树/哈希表
int size() | 返回元素个数 |
bool empty() | 判空 |
void clear() | 清空 |
iterator begin()/end() | 返回指向容器中已排好序的第一个/最后一个键值对的双向迭代器。 |
operator++ -- | 返回前驱和后继 O(logn) |
void insert(pair<T> p) | 插入一个T类型pair |
void erase(pair<T> p)/(iterator it) | 删除键值对p或it指向元素 |
iterator find(T x) | 查找x,返回指向x的双向迭代器 |
operator[] | 随机存取,multimap不支持此操作 O(logn),访问失败会插入新key |
void at(int k) | 找到 key 键对应的值,如果找不到,该函数会引发 out_of_range 异常。 |
lower_bound()/upper_bound() | 返回>=x/>x的最小数的迭代器(ordered) |
注:unordered_map 增删改查的时间复杂度是O(1)
for(auto it : map1){//c++11
cout << it.first <<" "<< it.second <<endl;
}
十、bitset(压位)
//定义在...
bitset<cnt> s | 创建cnt大小的bitset |
int count() | 返回有多少个1 |
bool any() | 判断是否至少有一个1 |
bool none() | 判断是否全为0 |
void set() | 把所有位置变成1 |
void set(int k,int v) | 将第k位变成v |
void reset() | 把所有位变成0 |
void flip() | 等价于~,按位取反 |
void flip(int k) | 把第k位取反 |
~,&,|,^,>>,<<,==,!=,[]//重载运算符