当前位置: 首页 > news >正文

C++ STL 核心容器速查表

1️⃣ vector(动态数组)

基本操作

#include<vector>usingnamespacestd;vector<int>v;// 声明vector<int>v(10);// 声明长度为10的vectorvector<int>v(10,5);// 声明长度为10,初始值为5vector<int>v{1,2,3};// 初始化列表// 增v.push_back(x);// 尾部添加元素v.pop_back();// 删除尾部元素v.insert(v.begin()+i,x);// 在位置i插入x(O(n))// 删v.erase(v.begin()+i);// 删除位置i的元素(O(n))v.erase(v.begin()+l,v.begin()+r);// 删除[l, r)区间v.clear();// 清空v.resize(n);// 调整大小为n// 查v[i]// 访问第i个元素(不检查边界)v.at(i)// 访问第i个元素(检查边界)v.front()// 第一个元素v.back()// 最后一个元素// 其他v.size()// 元素个数v.empty()// 是否为空v.capacity()// 容量v.begin()// 起始迭代器v.end()// 结束迭代器

竞赛常用技巧

// 1. 遍历for(intx:v)cout<<x<<" ";// 范围forfor(inti=0;i<v.size();i++)...// 下标遍历for(autoit=v.begin();it!=v.end();it++)...// 迭代器// 2. 排序sort(v.begin(),v.end());// 升序sort(v.begin(),v.end(),greater<int>());// 降序// 3. 去重(需要先排序)sort(v.begin(),v.end());v.erase(unique(v.begin(),v.end()),v.end());// 4. 二维vectorvector<vector<int>>mat(n,vector<int>(m));// n行m列// 5. 清空并释放内存vector<int>().swap(v);// 彻底释放内存

2️⃣ queue(队列)

基本操作

#include<queue>usingnamespacestd;queue<int>q;// 声明// 增q.push(x);// 入队// 删q.pop();// 出队(删除队首)// 查q.front()// 队首元素q.back()// 队尾元素// 其他q.size()// 元素个数q.empty()// 是否为空

优先队列(priority_queue)

priority_queue<int>pq;// 大根堆(默认)priority_queue<int,vector<int>,greater<int>>pq;// 小根堆// 自定义比较(结构体)structNode{intval,priority;booloperator<(constNode&other)const{returnpriority<other.priority;// 大根堆}};priority_queue<Node>pq;// 操作pq.push(node);// 入队pq.pop();// 出队pq.top();// 访问堆顶pq.size();pq.empty();

双端队列(deque)

#include<deque>deque<int>dq;// 两端都可以操作dq.push_back(x);// 尾部插入dq.push_front(x);// 头部插入dq.pop_back();// 尾部删除dq.pop_front();// 头部删除dq[i]// 随机访问(O(1))

3️⃣ map(映射)

基本操作

#include<map>usingnamespacestd;map<int,string>mp;// 声明(按键升序)unordered_map<int,string>mp;// 哈希map(无序,更快)// 增/改mp[key]=value;// 插入或修改mp.insert({key,value});// 插入mp.insert(make_pair(k,v));// 插入// 删mp.erase(key);// 删除键为key的元素mp.erase(mp.begin());// 删除第一个元素mp.clear();// 清空// 查mp[key]// 访问(不存在会创建)mp.at(key)// 访问(不存在会抛异常)mp.count(key)// 是否存在(0或1)mp.find(key)// 查找,返回迭代器// 其他mp.size()mp.empty()mp.begin()mp.end()

常用技巧

// 1. 遍历for(autop:mp){cout<<p.first<<" "<<p.second<<endl;}// 2. 查找是否存在if(mp.count(key)){cout<<"存在: "<<mp[key]<<endl;}// 3. 使用find(避免自动创建)autoit=mp.find(key);if(it!=mp.end()){cout<<"找到: "<<it->second<<endl;}// 4. 反向遍历(map特有)for(autoit=mp.rbegin();it!=mp.rend();it++){cout<<it->first<<" "<<it->second<<endl;}// 5. 统计词频map<string,int>cnt;cnt[word]++;// 自动初始化为0// 6. 自定义排序structcmp{booloperator()(constint&a,constint&b)const{returna>b;// 降序}};map<int,string,cmp>mp;

multimap(允许重复键)

multimap<int,string>mmp;mmp.insert({key,value});// 插入(允许多个相同key)mmp.count(key);// 返回key的个数mmp.lower_bound(key);// 第一个>=key的位置mmp.upper_bound(key);// 第一个>key的位置

4️⃣ set(集合)

基本操作

#include<set>usingnamespacestd;set<int>s;// 声明(自动去重+排序)unordered_set<int>s;// 哈希set(无序)// 增s.insert(x);// 删s.erase(x);s.clear();// 查s.count(x)// 是否存在s.find(x)// 查找// 其他s.size()s.empty()s.begin()s.end()

常用技巧

// 1. 遍历(自动有序)for(intx:s)cout<<x<<" ";// 2. 去重vector<int>v={1,2,2,3};set<int>s(v.begin(),v.end());// 3. 查找第一个>=x的元素autoit=s.lower_bound(x);if(it!=s.end())cout<<*it;// 4. 查找第一个>x的元素autoit=s.upper_bound(x);

📊 复杂度对比

容器查找插入删除访问
vectorO(n)O(1)*O(n)O(1)
dequeO(n)O(1)O(n)O(1)
queue-O(1)O(1)O(1)
mapO(log n)O(log n)O(log n)O(log n)
unordered_mapO(1)O(1)O(1)O(1)
setO(log n)O(log n)O(log n)-

*vector 尾部插入是 O(1),中间插入是 O(n)


🎯 竞赛选择指南

需求推荐容器
动态数组,频繁访问vector
BFSqueue
最短路(Dijkstra)priority_queue
需要排序+去重set
键值对,需要有序map
键值对,不需要有序unordered_map
两端操作deque
快速查找元素是否存在unordered_set

⚠️ 易错点提醒

  1. vector 越界v[i]不检查边界,v.at(i)检查
  2. map 自动创建mp[key]不存在时会创建(值为默认值)
  3. 迭代器失效:删除元素后,迭代器可能失效
  4. unordered 可能退化:极端情况下退化为 O(n)
  5. 优先队列默认大根堆:小根堆要用greater<int>
http://www.cnnetsun.cn/news/1636437.html

相关文章:

  • Elixir Plug中间件深度解析:Logger、Parser、Static等核心插件的使用技巧
  • Hunyuan-MT-7B模型实战:Pixel Language Portal与RabbitMQ集成构建异步高可靠翻译任务队列
  • 测试数据治理:一个让所有测试人员头疼的“脏活”
  • Hitboxer:专业级键盘映射与SOCD清洁工具,让你的游戏操作告别方向冲突
  • 如何用Botty实现暗黑破坏神2智能自动化:零基础玩家的高效刷宝指南
  • 一键捕获完整网页:Full Page Screen Capture 高效解决方案
  • 避坑指南:QTableWidget增删行时,currentRow()返回-1怎么办?
  • 新手零基础指南:在快马平台用ai生成你的第一个openclaw千问配置项目
  • 新手福音:在快马平台动手实践,轻松掌握openclaw启动命令
  • 霸王茶姬海外业务持续高增长,GMV超315亿该咋看?
  • COLMAP去畸变踩坑实录:从分辨率报错到完美修复的完整流程
  • 新手福音:免去Copaw安装烦恼,在快马平台边学边练掌握Web自动化
  • 论文降AI率:花100元和花300元有什么区别?价格效果对比
  • 保姆级教程:在OpenEuler 22.03 LTS-SP4上,用cephadm搞定Ceph Pacific集群部署
  • Qwen3.5-2B轻量化优势展示:相同GPU下并发数提升300%实测数据
  • 别再手动CRUD了!用这个SpringBoot+AI的脚手架,5分钟搞定一个智能管理后台
  • Apache Flink 核心面试题深度剖析:从入门到源码级理解
  • 【数据结构与算法】二叉树遍历 集合
  • I.MX6U-MINI开发板系统固化全流程:从uboot编译到rootfs烧录(附网络配置技巧)
  • 深入解析 | 差分进化算法在工程优化中的应用(Matlab/Python实战)
  • 告别EKF的雅可比矩阵:用Python从零实现一个UKF(附完整代码与车辆轨迹预测Demo)
  • DFIG_Wind_Turbine:基于MATLAB/Simulink的双馈异步风力发电机仿真模型
  • 浅谈MIKEURBAN计算进度条停止的解决方法
  • 聚四氟乙烯可以与强酸或者强碱反应吗
  • 国风美学模型在游戏开发中的应用:快速生成场景原画与道具图标
  • Phi-4-mini-reasoning基础教程:tokenizer对长数学表达式(含∑∫√)的切分实测
  • PyTorch动态计算图实战:为什么你的backward()总是报错?
  • KubeSphere All-in-One 安装避坑指南:从零搭建到可视化平台访问
  • 实战应用:基于快马平台从零到一构建功能完备的openclaw101风格项目平台
  • 实测Qwen3.5推理模型:用它写代码、解逻辑题,效果到底有多强?