C++ STL常用容器以及操作简介
Posted OpenAll_Zzz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ STL常用容器以及操作简介相关的知识,希望对你有一定的参考价值。
文章目录
C++ STL:用法简介 + 常用接口
1.vector
vector是一种变长数组,应用了倍增的思想
用法:vector<数据类型> 变量名(数组大小,数组初始化时每个元素的默认值)
。
举例:vector<int> a(10, 1)
,定义的是一个大小为10(数组大小)
,每个元素均为int(数据类型)
型的数据3(初始化时的值)
的数组a(变量名)
。
常用接口:
a.size()
: 返回容器a
的大小。a.empty()
: 判断容器a
是否为空。为空返回true
,否则返回false
。a.clear()
: 清空容器a
,使其size
变为0。front()/back()
: 容器的首个元素和最后一个元素。push_back()/pop_back()
: 从尾部插入一个元素;从尾部删除一个元素。begin()/end()
: 迭代器首元素地址和最后一个元素的地址。[]
: 支持随机访问,a[i]
。支持比较运算
:按字典序比较。
注意:以上
size()/empty()
两个接口在本文章所介绍到的容器中都有着相同的接口,且时间复杂度均为O(1),以下不再赘述。
2.string
string
是C++对字符数组进行了封装,使用起来更便捷了
用法:例如:string s = "OpenAll_Zzz"
。
操作方式:可以在字符串最后添加字符串或者是字符,即s += "hh"
或者是s += 'p'
都是可以的。
常用接口:
substr(start, Length)
:返回的是字符串的子串,第一个参数start
为子串在原字符串中的起始位置,第二个参数Length
为子串的长度,特殊的,如果Length
十分大,超过原串的最后一个字符,则返回到最后一个字符为止,省略第二个参数也是返回到最后一个字符为止。c_str()
: 该接口返回的是字符串的首个字符的地址,printf()
无法直接输出string
,可借助c_str()
来输出,即printf("%s", s.c_str())
。a.length()
:返回字符串的长度,和size()
作用一致。
3.queue
C++将队列实现并封装起来了,提供了一些常用的接口,下面介绍如何定义一个队列以及这些接口的使用方式。
定义方式:1. 首先在程序中需要包含头文件#include <queue>
2. queue<元素类型> 队列名
。
常用接口:
push()
: 向队尾插入一个元素。front()
: 返回队头元素。back()
: 返回队尾元素。pop()
: 弹出队头元素 。
4.priority_queue
C++实现并封装了优先队列,也就是堆,默认是大根堆,下面介绍相关接口的用法以及定义方式。
定义方式:priority_queue<int> heap
,这里的int
是优先队列中的元素类型,heap
是定义的优先队列的名称。
常用接口:
push()
: 向堆中插入一个元素。top()
: 返回堆顶元素。pop()
: 弹出堆顶元素。
定义小根堆的两种方式
- 插入相应值的负值:
heap.push(-x)
,访问时再添加个负号即可,利用了大根堆的特性。 - 直接定义:
priority_queue<int, vector<int>, greater<int>> heap
为小根堆。
5.stack
C++实现并封装了栈,下面介绍如何定义以及相关接口的使用。
定义方式:stack<int> s
。
常用接口
push()
:向栈顶插入一个元素。top()
:返回栈顶元素。pop()
:弹出栈顶元素。
6.deque
deque
相当于加强版的vector
,在deque
的两端都支持添加和删除操作,效率比较低。
常用接口
clear()
:清空元素,类似vector
中的clear()
。front()
:返回第一个元素。back()
:返回最后一个元素。push_back()/pop_back()
:在队尾插入/在队尾删除。push_front()/pop_front()
:在队头插入/在队头删除。begin()/end()
:支持迭代器访问。[]
:支持随机访问。
7.set、map、multiset、multimap
基于平衡二叉树(红黑树)实现,动态的维护一组有序序列
注意:含有multi
前缀的容器里,元素可以重复出现。
涉及到增删改查的操作时间复杂度绝大部分是O(logn)
级别的
常用接口:
clear()
:清空元素。begin()/end()
:支持迭代器访问,迭代器的++、--
操作。
set
和multiset
的常用接口:
insert()
:插入一个数。find()
:查找一个数,没找到时返回end()
的值。count()
:返回一个数出现的次数。erase()
:①输入一个数x,删除所有的x,时间复杂度O(k+logn)
;②输入一个迭代器,删除这个迭代器。lower_bound()/upper_bound()
:返回大于等于x的最小的数的迭代器/返回大于x的最小的数的迭代器。
map
和multimap
的常用接口:
insert()
:插入的数据类型为pair
。erase()
:输入的参数类型为pair()
或迭代器
。find()
:查找一个数,不存在时返回end()
的值。map支持[]访问,multimap由于可以存在键相同的pair,故不支持[]访问
。lower_bound()/upper_bound()
:返回大于等于x的最小的数的迭代器/返回大于x的最小的数的迭代器。
8.unordered_set、unordered_map、unordered_multiset、unordered_multimap
基于哈希表实现的容器,内部是无序的。
注意:含有multi
前缀的容器里,元素可以重复出现。
所涉及的基本操作的时间复杂度基本上是O(1)
级别的。
常用接口:
clear()
:清空元素。begin()/end()
:支持迭代器访问,由于内部无序所以不支持迭代器的++、--
操作。
unordered_set
和unordered_multiset
的常用接口:
insert()
:插入一个数。find()
:查找一个数,没找到时返回end()
的值。count()
:返回一个数出现的次数。erase()
:①输入一个数x,删除所有的x,时间复杂度O(1)
;②输入一个迭代器,删除这个迭代器。
unordered_map
和unordered_multimap
的常用接口:
insert()
:插入的数据类型为pair
。erase()
:输入的参数类型为pair()
或迭代器
。find()
:查找一个数,不存在时返回end()
的值。unordered_map支持[]访问,unordered_multimap由于可以存在键相同的pair,故不支持[]访问
。
9.bitset
它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用
1bit
空间
定义方式: bitset <个数> 变量名
,默认每一位为0。
支持操作: ~,&,|,^ ,>>,<<, ==,!=,[]
。
常用接口:
count()
; 返回某一个数中1的个数。any()
; 判断是否至少有一个1。none()
; 判断是否全为0。set()
; 把所有位置赋值为1。set(k,v)
; 将第k位变成v。reset()
; 把所有位变成0。flip()
; 把所有位取反,等价于~。flip(k)
; 把第k位取反。
以上是关于C++ STL常用容器以及操作简介的主要内容,如果未能解决你的问题,请参考以下文章