STL容器

一、顺序容器

容器中的位置来顺序保存和访问的

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)用队列实现栈

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值