STL

vector

变长数组

  • 初始化方式
    • vector a(10, 3); //初始化,10个3
    • vector a[10]; 声明一个数组
  • 支持的函数
    • size() 时间复杂度O(1)
    • length() 同size()
    • empty()
    • clear() 并不是所有的容器都有这个方法
    • front(), back()
    • push_back(), pop_back()
    • begin(), end() 左闭右开
    • 支持随机寻址
  • 倍增思想 : 尽可能减小向系统申请空间的次数,同时又不能浪费空间;每次当容量不够时,重新申请所需空间两倍的空间,并将原数组copy过来,均摊时间复杂度为O(1)
  • 系统为某一程序分配空间所需要的时间与申请的空间大小无关,只与申请次数有关
  • 迭代器方式遍历:
for(vector<int>::iterator i = a.begin(); i != a.end(); i ++ ) cout << *i << endl;
  • 同时支持下标遍历、范围遍历
  • 支持比较运算,从高位向低位按照字典序比较

pair

可以存储一个二元组

  • 前后两个变量类型可以任意
  • 获取第一、二个元素:p.first, p.second
  • 支持比较运算,按照字典序排序,优先按照first比较
  • 构造pair:
p = make_pair(x, y)
//或者
p = {x, y};
  • 常用情景是“附带卫星数据”、“按照某个主要数据排序”
  • pair相当于帮我们实现了比较函数的结构体

string

字符串数组

  • 对字符串的封装
  • 支持的操作:
    • size()
    • empty()
    • clear()
    • '+'
    • substr(a, b) a表示子串的起始位置,b表示子串的长度(缺省表示直到结尾)
    • c_str()可以返回所存储字符数组的起始地址

queue

队列

  • 支持的操作:
    • push()
    • front()
    • back()
    • pop()
    • size()
    • empty()
    • 注意没有clear函数、
  • 想要清空,直接重新构造 q = queue()

priority_queue

优先队列

  • 需要包含头文件
  • 底层实现是堆
  • 支持的操作:
    • push()
    • pop()
    • top()
    • empty()
    • size()
  • 默认声明的是大根堆
  • 实现小根堆的方式:
    • 插入的时候插入对应数字的负数
    • 按照下面的方式来定义
priority_queue<int, vector<int>, greater<int>> heap;

stack

  • 支持的操作:
    • push()
    • top()
    • pop()
    • empty()
    • size()

deque

双端队列

  • 相当于加强版本的vector
  • 支持的操作:
    • size()
    • empty()
    • clear()
    • front() back()
    • push_front() push_back()
    • pop_front() pop_back()
  • 缺点是很慢

set, map, multiset, multimap

  • 加multi表示可以有重复元素
  • 底层实现是红黑树
  • ++ -- 时间复杂度logn
set/multiset
  • 支持的操作:
    • begin() end()
    • insert()
    • find()
    • count()
    • erase()
      • 输入是一个数x,删除所有x 时间复杂度O(k + logn)
      • 输入是一个迭代器,删除这个迭代器
    • lower_bound(x) 返回大于等于x的最小的数的迭代器
    • upper_bound(x) 返回大于x的最小的数的迭代器
map/multimap
  • 支持的操作:
    • begin() end()
    • insert() 插入的数是一个pair
    • erase() 参数是pair或迭代器
    • find()
    • lower_bound(), upper_bound()
  • 可以像用数组一样用map,时间复杂度是logn

unordered_set, unordered_map, unordered_multiset, unordered_multimap

  • 和上面的类似,增删改查的时间复杂度是O(1)
  • 不支持lower_bound(), upper_bound()等基于排序的操作
  • 不支持迭代器的++ --

bitset

压位

  • 定义: bitset<10000> s;
  • 支持的操作:
    • ~ & | ^
    • 移位运算符
    • == !=
    • []
    • count() 返回有多少个1
    • any() 判断是否至少有一个1
    • none() 判断是否全为0
    • set() 把所有位置为1
    • set(k, v) 将第k位变成v
    • reset() 把所有位变成0
    • flip() 等价于~
    • flip(k) 第k位取反
posted @ 2021-04-17 23:43  呼_呼  阅读(36)  评论(0编辑  收藏  举报