C++ STL常用容器以及操作简介 刷题必备技能

3 篇文章 0 订阅
1 篇文章 1 订阅

C++ STL:用法简介 + 常用接口

  • 新增@1:emplace_backvector添加pair时,应该是xx.emplace_back(x, y),需要与xx.push_back({x, y})区分开。

1.vector

vector是一种变长数组,应用了倍增的思想

用法vector<数据类型> 变量名(数组大小,数组初始化时每个元素的默认值)

举例vector<int> a(10, 1),定义的是一个大小为10(数组大小),每个元素均为int(数据类型)型的数据3(初始化时的值)的数组a(变量名)
返回空数组的方法return vector<int> {},C++11支持更简洁的方式return {}
常用接口

  1. a.size() : 返回容器a的大小。
  2. a.empty() : 判断容器a是否为空。为空返回true,否则返回false
  3. a.clear() : 清空容器a,使其size变为0。
  4. front()/back() : 容器的首个元素和最后一个元素。
  5. push_back()/pop_back() : 从尾部插入一个元素;从尾部删除一个元素。
  6. begin()/end() : 迭代器首元素地址和最后一个元素的地址。
  7. [] : 支持随机访问,a[i]
  8. 支持比较运算:按字典序比较。
  9. lower_bound(a.begin(), a.end(), x)/upper_bound(a.begin(), a.end(), x) : 返回大于等于x的最小的数的迭代器/返回大于x的最小的数的迭代器。

注意:以上size()/empty()两个接口在本文章所介绍到的容器中都有着相同的接口,且时间复杂度均为O(1),以下不再赘述。

2.string

string是C++对字符数组进行了封装,使用起来更便捷了

用法:例如:string s = "OpenAll_Zzz"

操作方式:可以在字符串最后添加字符串或者是字符,即s += "hh"或者是s += 'p'都是可以的。

常用接口

  1. substr(start, Length) : 返回的是字符串的子串,第一个参数start为子串在原字符串中的起始位置,第二个参数Length为子串的长度,特殊的,如果Length十分大,超过原串的最后一个字符,则返回到最后一个字符为止,省略第二个参数也是返回到最后一个字符为止。
  2. c_str() : 该接口返回的是字符串的首个字符的地址,printf()无法直接输出string,可借助c_str()来输出,即printf("%s", s.c_str())
  3. a.length() : 返回字符串的长度,和size()作用一致。
  4. a.push_back(c) : 在字符串的末尾添加一个字符c
  5. a.pop_back() : 删除字符串a末尾的字符。
  6. a.erase(p, n) : 删除在字符串a中从下标p(包括p位置的字符)开始的一共n个连续字符。
  7. a.back() : 返回字符串a最后一个字符。
  8. a.front() : 返回字符串a第一个字符。
  9. a.find(c) : 返回字符串a中的字符c第一次出现时的下标,如果没有则返回-1

3.queue

C++将队列实现并封装起来了,提供了一些常用的接口,下面介绍如何定义一个队列以及这些接口的使用方式。

定义方式:1. 首先在程序中需要包含头文件#include <queue> 2. queue<元素类型> 队列名

常用接口

  1. push() : 向队尾插入一个元素。
  2. front() : 返回队头元素。
  3. back() : 返回队尾元素。
  4. pop() : 弹出队头元素 。

4.priority_queue

C++实现并封装了优先队列,也就是堆,默认是大根堆,下面介绍相关接口的用法以及定义方式。

定义方式priority_queue<int> heap,这里的int是优先队列中的元素类型,heap是定义的优先队列的名称。

常用接口

  1. push() : 向堆中插入一个元素。
  2. top() : 返回堆顶元素。
  3. pop() : 弹出堆顶元素。

定义小根堆的两种方式

  1. 插入相应值的负值:heap.push(-x),访问时再添加个负号即可,利用了大根堆的特性。
  2. 直接定义:priority_queue<int, vector<int>, greater<int>> heap为小根堆。

5.stack

C++实现并封装了栈,下面介绍如何定义以及相关接口的使用。

定义方式stack<int> s

常用接口

  1. push():向栈顶插入一个元素。
  2. top():返回栈顶元素。
  3. pop():弹出栈顶元素。

6.deque

deque相当于加强版的vector,在deque的两端都支持添加和删除操作,效率比较低。

常用接口

  1. clear():清空元素,类似vector中的clear()
  2. front():返回第一个元素。
  3. back():返回最后一个元素。
  4. push_back()/pop_back():在队尾插入/在队尾删除。
  5. push_front()/pop_front():在队头插入/在队头删除。
  6. begin()/end():支持迭代器访问。
  7. []:支持随机访问。

7.set、map、multiset、multimap

基于平衡二叉树(红黑树)实现,动态的维护一组有序序列
注意:含有multi前缀的容器里,元素可以重复出现。
涉及到增删改查的操作时间复杂度绝大部分是O(logn)级别的

常用接口

  1. clear():清空元素。
  2. begin()/end():支持迭代器访问,迭代器的++、--操作。

setmultiset的常用接口:

  1. insert():插入一个数。
  2. find():查找一个数,没找到时返回end()的值。
  3. count():返回一个数出现的次数。
  4. erase():①输入一个数x,删除所有的x,时间复杂度O(k+logn);②输入一个迭代器,删除这个迭代器。
  5. s.lower_bound(x)/s.upper_bound(x):返回大于等于x的最小的数的迭代器/返回大于x的最小的数的迭代器。

mapmultimap的常用接口

  1. insert():插入的数据类型为pair
  2. erase():输入的参数类型为pair()迭代器
  3. find():查找一个数,不存在时返回end()的值。
  4. map支持[]访问,multimap由于可以存在键相同的pair,故不支持[]访问
  5. lower_bound()/upper_bound():返回大于等于x的最小的数的迭代器/返回大于x的最小的数的迭代器。

8.unordered_set、unordered_map、unordered_multiset、unordered_multimap

基于哈希表实现的容器,内部是无序的。
注意:含有multi前缀的容器里,元素可以重复出现。
所涉及的基本操作的时间复杂度基本上是O(1)级别的。

常用接口

  1. clear():清空元素。
  2. begin()/end():支持迭代器访问,由于内部无序所以不支持迭代器的++、--操作。

unordered_setunordered_multiset的常用接口:

  1. insert():插入一个数。
  2. find():查找一个数,没找到时返回end()的值。
  3. count():返回一个数出现的次数。
  4. erase():①输入一个数x,删除所有的x,时间复杂度O(1);②输入一个迭代器,删除这个迭代器。

unordered_mapunordered_multimap的常用接口

  1. insert():插入的数据类型为pair
  2. erase():输入的参数类型为pair()迭代器
  3. find():查找一个数,不存在时返回end()的值。
  4. unordered_map支持[]访问,unordered_multimap由于可以存在键相同的pair,故不支持[]访问

9.bitset

它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间

定义方式bitset <个数> 变量名,默认每一位为0。

支持操作~,&,|,^ ,>>,<<, ==,!=,[]

常用接口

  1. count(); 返回某一个数中1的个数。
  2. any(); 判断是否至少有一个1。
  3. none(); 判断是否全为0。
  4. set(); 把所有位置赋值为1。
  5. set(k,v); 将第k位变成v。
  6. reset(); 把所有位变成0。
  7. flip(); 把所有位取反,等价于~。
  8. flip(k); 把第k位取反。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值