标准模板库(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位取反

~,&,|,^,>>,<<,==,!=,[]//重载运算符