C++STL

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_**打头的容器底层实现都是哈希表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值