1 向量 vector
连续的顺序的储存结构(与数组类似),但是长度可变
作用 | 用法 | 示例 |
---|---|---|
构造 | vector<类型> vec( 长度 , [初值] ) | vector<int> vec( 10 , 1 ); |
尾部添加元素 | .push_back(元素) | vec.push_back(5); |
删除尾部元素 | .pop_back() | vec.pop_back(); |
访问元素 | vector[下标] | vec[3]; |
查看大小 | .size() | vec.size(); |
清空容器 | .clear() | vec.clear(); |
判断是否有元素(判空) | .empty() | vec.empty(); |
改变长度 | .resize( 新长度, [默认值] ) | vec.resize( 8 , 0 ) |
补充:
1.构造二维vector:
vector<vector<int>> vec( 10 , vector<int> ( 8 , 1 ))
//(构造了一个10行8列,初值为1的二维vector)
2.可使用.insert()函数在指定位置插入元素,传入参数为插入起始地址(迭代器)和插入的元素(可以是元组,vector等)
3.可使用.erase()函数删除指定位置(或范围)的元素,传入参数可以是某个地址(或迭代器)或地址的范围(迭代器的范围)
4 .empty()返回值为bool类型,如果vector为空返回true,否则为false
5 .resize修改长度时,如果为缩短,则删除后面多余的元素,如果为扩大,新元素为默认值,旧元素不变
6.vector能够很好的替换掉普通数组(除了有些情况对时间复杂度要求特别苛刻),可减少内存的浪费,此外,其数据储存在堆空间,不会爆栈
注意事项
1.若vector的长度已经确定,应在构造时就指定其长度,而不是慢慢.push_back(),因为给vector重新分配内存仍有时间开销
2.使用.size()时,其返回值类型为size_t,可能会导致数据溢出(如32位编译器下,该类型取值范围为[ 0 , 2^32 ) )
2 栈 stack
通过二次封装双端队列 (deque) 容器,实现先进后出的栈数据结构,像一个桶一样
作用 | 用法 | 示例 |
---|---|---|
构造 | stack<类型> stk | stack<int> stk; |
进栈 | .push() | stk.push(); |
出栈 | .pop() | stk.pop(); |
使用栈顶元素 | .top() | int m = stk.top(); |
查看大小/清空/判空 | (与vector类似) | (与vector类似) |
补充及注意事项
1.vector也可以当栈使用,使用vector的.back()访问其尾部元素,相当于使用栈顶元素,.push_back()相当于进栈,.pop_back()相当于出栈
2.stack不可访问栈内元素,只能访问栈顶
3 队列 queue
通过二次封装双端队列 (deque) 容器,实现先进先出的队列数据结构,类似于水管
作用 | 用法 | 示例 |
---|---|---|
构造 | queue<类型> que | queue<int> que; |
进队 | .push(元素) | que.push(3); |
出队 | .pop() | que.pop(); |
使用队首元素 | .front() | int m = que.front(); |
使用队尾元素 | .back() | int n = que.back(); |
查看大小/清空/判空 | 略 | 略 |
注意事项
queue也不可访问队列中的元素
4 优先队列 priority_queue
提供常数时间的最大(或最小)元素查找,对数时间的插入与提取,底层原理是二叉堆动画解释二叉堆https://www.bilibili.com/video/BV11t4y1r79L/
构造
priority_queue<类型,容器,比较器> pque
类型:储存的数据类型
容器:储存数据所用的底层容器,默认为vector<类型>
比较器:比较大小使用的比较器,默认为less<类型>,大顶堆(其堆顶为最大的那个元素),可改为greater<类型>,变成小顶堆(其堆顶为最小的那个元素)
作用 | 用法 | 示例 |
---|---|---|
进堆 | .push(元素) | pque.push( 2 ); |
出堆 | .pop() | pque.pop(); |
访问堆顶元素 | .top() | int m = pque.top(); |
查看大小/判空(无清空) | 略 | 略 |
适用及注意事项
1.可以持续维护元素的有序性:每次向堆中插入大小不定的元素,或者取出堆中大小最大/最小的元素,如果元素数量为n,插入元素数量为k,则总的时间复杂度为O(k*log n),相比插入一个vector后再进行快排的方法(时间复杂度为k*n*log n)更加快速
2.只可访问堆顶元素,无法读取其他元素
3.堆中所有元素不可修改,除了堆顶元素可采用 先出堆进行修改再入堆 的操作,但其修改后不一定仍为堆顶元素