C++刷题时遇到的STL的常用tips
持续更新,欢迎指正
数组初始化:int a[n]={0}; 如果是局部变量其实只有第一个元素被初始化为{}中元素,其他自动初始化为0,但全局变量就会全初始化为0.
当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。
数组节省空间,但是只能映射有限范围的数字;
set主要存储相应数组数字,只能存储数字集合,即不含下标信息。
但是便于查找:
set.find(element) != set.end();
//找到了,返回的是element的迭代器
找不到插入:
set.insert(element);
map可储存键key 和 key对应的值 value, 相交于set, 可以存储相应数组的数字和下标。
此时查找:
iterator iter = map.find(element) ;
//返回的是element的迭代器
iter != map.end();
//找到了
key = iter.first
value = iter.second
//取找到的键及键值
找不到插入:
map.insert(pair<sizeof key, sizeof value>(key, value))
//以双元组形式插入键值对,这里的key不能是可变数据结构
tips:插入先前没有的可变结构进入现有结构时,要据未有数据结构的规则新建对象后插入。
库函数reverse可以实现数组反转:
reverse(反转变量头地址, 反转变量尾地址)
字符串是增加了结束判断“\0”的char型数组,当定义为string类型,增加相关处理字符串的接口(功能实现),例如重载了‘+’,使字符串直接相加,同时结束也可用string.size()来判断。
vector容器可以用迭代器遍历与反向遍历,rbegin()开始,rend()结束,是从指向vector 的最后一个元素的迭代开始,到指向第一个元素的迭代器结束,将r去掉就是正向遍历
想要遍历容器map或者set,需要创建迭代器并以下列形式遍历全体元素:
for(iterator/auto i = map/set.begin(); i != map/set.end(); i++)
vector是有擦除一个元素的功能的,如果是特定的元素,用erase(该元素对应容器的迭代器)
如果想要删除队尾元素,直接pop_back()
即可。
对vector排序默认是按照第一个元素由小到大排列,不用重新规定一个排序函数
deque数据结构是双向队列,两端都能删除元素,分别是pop_front()
和pop_back()
priority_queue优先队列:
基本形式:
priority_queue<储存元素类型, 容器类型, 大顶/小顶函数>;
自定义堆的比大小方式:
- 可不写,默认构造大顶堆
greater<int>
规定小顶堆
vector初始化可以规定大小如vector<int> 名字 (大小k)
迭代器的声明方式
std::容器类型::iterator it = 容器.begin();
在执行插入扩容操作时list的时间效率会更高,list底层用链表实现,vector底层用普通数组实现,插入位置不够时需要扩容,此时拷贝数组会费时,因此相同insert选择list容器
list容器变vector
vector<元素类型>(list.begin(), list.end())
ps:字符串既具有数组的切片功能,也具有vector的push_back()
和pop_back()
函数
C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树,平衡二叉搜索树指的树的左右层数不超过1
C++中一般**unordered_**打头的容器底层实现都是哈希表