一、顺序容器
容器中的位置来顺序保存和访问的
vector向量(动态数组)
底层数据结构为数组,特性:
1)支持随机快速访问:时间复杂度为O(1);
2)插入或删除非尾结点:时间复杂度为O(n);
3)若初始分配空间已满会引起扩容,重新申请一个 1.5 / 2 倍大的内存空间,将原空间内容拷贝过来,随后释放原空间,操作耗时。
注意:插入和删除操作后会导致旧迭代器失效。
#include<vector>
vector<int> a;
//末尾添加元素data
a.push_back(data);
//末尾删除元素
a.pop_back();
//返回第一个元素
a.front();
//返回最后一个元素
a.back();
//pos位置插入元素data
a.insert(pos,data)
//将pos1位置元素和pos2位置元素交换
a.swap(pos1,pos2);
//清空所有元素
a.clear();
list列表
底层数据结构为双向循环链表,特性:
1)支持快速的增删:时间复杂度为O(1);
2)查找元素:时间复杂度为O(n);
2)内存地址不连续
#include<list>
list<int> a;
//链尾压入
a.push_back();
//链头压入
a.push_front();
//链尾弹出
a.pop_back();
//链头弹出
a.pop_front();
//返回链尾值
a.back();
//返回链头值
a.front();
deque双端队列
底层数据结构为双向队列,特性:
1)支持首尾快速增删,也支持随机快速访问
//双端队列
#include <deque>
deque<int> a
//队尾压入
a.push_back();
//队头压入
a.push_front();
//队尾弹出
a.pop_back();
//队头弹出
a.pop_front();
//返回队尾值
a.back();
//返回队头值
a.front();
LeetCode:
(293)滑动窗口最大值
二、关联容器
元素是按关键字来保存和访问的,关联容器不需要做内存拷贝和内存移动,map和set容器的所有元素都是以节点方式来存储
map映射(key-value)
1)map 底层数据结构为红黑树,有序,不重复,增删查时间复杂度O(logn)
2)multimap 底层数据结构为红黑树,有序,可重复,增删查时间复杂度O(logn)
3)unordered_map 底层数据结构为哈希表,无序,不重复,增删查时间复杂度O(1)
4)unordered_multimap 底层数据结构为哈希表,无序,可重复 ,增删查时间复杂度O(1)
#include <map>
std:map<int,string> Student;
//三种插入数据方式
Student.insert(pair<int, string>(1, "jack"));
Student.insert(map<int, string>::value_type (2, "tom"));
mapStudent[3] = "lucy"; //可覆盖
//迭代器遍历
map<int, string>::iterator iter;
for(iter = Student.begin(); iter != Student.end(); iter++)
//查找关键字
iter = Student.find(1);
if(iter != Student.end())
printf("key=%d,value=%d",iter->first,iter->second);
//返回出现次数(0,1)
Student.count();
//删除
Student.erase(iter);
Student.erase(1);
Student.clear();
LeeCode:
(242)有效的字母异位词
(1)两数之和
set集合(key)
1)set 底层数据结构为红黑树,有序,不重复,增删查时间复杂度O(logn)
2)multiset 底层数据结构为红黑树,有序,可重复 ,增删查时间复杂度O(logn)
3)unordered_set 底层数据结构为哈希表,无序,不重复,增删查时间复杂度O(1)
4)unordered_multiset 底层数据结构为哈希表,无序,可重复 ,增删查时间复杂度O(1)
三、容器适配器
适配器是对容器的再封装
priority_queue 优先级队列
底层数据结构为vector为底层容器,二叉堆heap为处理规则,特性:
1)相当于一个有权值的单向队列queue,所有元素按照优先级排列
2)二叉堆heap 分为 max-heap 和 min-heap
//优先队列
#include<queue>
//降序队列,大顶堆,队头最小(默认)
priority_queue<int,vector<int>,less<int>>;
//升序队列,小顶堆,队头最大
priority_queue<int,vector<int>,greater<int>>;
//默认缺省用法(大顶堆)
priority_queue<int> a;
//队头压入
a.push();
//队尾弹出
a.pop();
//返回队头值
a.top();
LeetCode:
(703)数据流中的第k大元素
stack栈
底层数据结构为list或deque,封闭头部即可,不用vector是因为容量大小有限制,扩容耗时,特性:
1)增删时间复杂度:O(1)
2)查找时间复杂度:O(n)
3)先进后出,FILO
//栈
#include <stack>
stack<int> a
//压入栈顶
a.push();
//栈顶弹出
a.pop();
//返回栈顶
a.top();
LeetCode:
(20)有效的括号
(232)用栈实现队列
queue单端队列
底层数据结构为list或deque,封闭头部即可,不用vector是因为容量大小有限制,扩容耗时,特性:
1)增删时间复杂度:O(1)
2)查找时间复杂度:O(n)
3)先进先出,FIFO
//单端队列
#include <queue>
queue<int> a
//队尾压入
a.push();
//队头弹出
a.pop();
//返回队头值
a.front();
//返回队尾值
a.back();
LeetCode:
(225)用队列实现栈