STL(标准模板库)以模板为基石,将容器和操作容器数据的方法分离开,形成了容器、迭代器、算法三部分,其中迭代器充当容器和算法的粘合剂。
C++的总体思路是:
高效,不检查错误;
复用,使用多态;
最小修改,使用适配器
容器共性
STL只提供copy和move语义,不提供引用语义,因此使用引用时需要包装器ref。
C++将容器分为线形容器、关联容器和无序容器三类,主要以时间和位置进行区分。
一些容器的共性如下:
/* 构造函数 */
c; //默认构造函数
c(c1); //拷贝构造函数
c = c1; //拷贝赋值构造函数
c(move(c1)); //移动构造函数
c = move(c1); //移动赋值构造函数
c{}; //列表初始化
c = {}; //列表初始化
c(begin,end); //区间构造函数
/* 析构函数 */
~
/* 比较运算符 */
==
!=
>
<
>=
<=
/* 容量 */
c.empty() //是否为空
c.size() //元素个数
c.maxsize() //最大容量
c.clear() //清空容器
/* 迭代器 */
c.begin()
c.end()
c.cbegin()
c.cend()
/* 交换 */
swap(c1,c2)
c.swap()
线形容器
Vector
#include <vector>
/* 构造函数 */
c(n,e); //批量初始化,使用n个字符e
c(n); //初始化容器大小为n
/* 容量 */
c.max_size() //极限容量值
c.reserve() //改变容量大小
c.capacity() //当前容量
c.shink_to_fit() //删除多余空间
/* 赋值 */
c = c2;
c = move(c2);
c = {};
c.assign(n,e);
c.assign(begin,end);
c.assign({});
/* 访问元素 */
c[i]
c.at(i)
c.front()
c.back()
/* 迭代器 */
c.rbegin()
c.rend()
c.crbgin()
c.crend()
/* 插入 */
c.push_back()
c.insert(pos,elem)
c.insert(pos,n,elem)
c.insert(pos,begin,endl)
c.insert(pos,{})
c.emplace(pos,...)
c.emplace_back(pos,...)
/* 删除 */
c.pop_back()
c.erase(i)
c.erase(begin,end)
/* 元素个数 */
c.resize(n)
c.resize(n,m)
Deque
Deque是vector的扩展,在vector基础上提供了前端操作:
#include <queue>
c.push_front()
c.pop_front()
List
List具有Deque的全部成员函数,其他成员函数如下:
#include <list>
/* 算法 */
c.unique()
c.unique(op)
c.sort()
c.sort(op)
c.merge()
c.merge(op)
c.reverse()
/* 插入 */
c.splice(pos,c2)
c.splice(pos,c2,c2pos)
c.plice(pos,c2,c2.begin(),c2.end())
/* 删除 */
remove()
remove_if()
Forward-List
#include <forward_list>
// forward_list的插入和删除接口都带after
c.insert_after()
c.erase_after()
c.splice_after()
关联容器
set
#include <set>
/* 比较算法 */
c.key_comp() //返回比较算法
c.value_comp() //返回key的比较准则
/* 查找元素 */
c.count(val) //返回val个数
c.find(val) //找到第一个val
c.lower_bound(val) //返回左边界
c.upper_bound(val) //返回右边界
c.equal_range(val) //返回区间
/* 赋值 */
c = c2;
c = move(c2);
c = {};
map
在set基础上,额外提供了:
/* 访问 */
c[key]
c.at(key)
/* 赋值 */
c[key] = value
/* 注意 */
c.count(key) //判断的是key,不是value
无序容器
/* 构造函数 */
c(bnum)
c(bnum,hf)
c(bnum,hf,cmp)
c(begin,end,bnum)
c(begin,end,bnum,hf)
c(begin,end,bnum,hf,cmp)
/* 哈希 */
c.hash_function() //返回哈希函数
c.key_eq() //返回相等判断式
c.bucket_count() //返回bucket数
c.max_bucket_count() //返回极限bucket数
c.load_factor() //返回负载系数
c.max_load_factor() //返回极限负载系数
c.max_load_factor(val) //设定极限负载系数
c.rehash() //重新hash
c.reserve() //重新hash
适配器
Stack
c.push()
c.top()
c.pop()
Queue
c.push()
c.front()
c.back()
c.pop()