当前位置: 首页 > 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.jsqmd.com/news/573120/

相关文章:

  • AirJelly发布,办公AI效率提升超40%
  • Windows音频API钩子深度解析:Audio Router架构剖析与技术实现原理
  • 移动端专项测试:除了功能,我们还需要关注什么?
  • 数据库优化最佳实践:2026 实战指南
  • UE5 C++(十六)— TimerHandle(定时器)的进阶应用与性能优化
  • LoRA训练实战32:LTX-2.3人物角色LoRA保姆级教程!低至8GB显存也能轻松上手
  • 实战应用:基于快马AI生成openclaw与Web服务的集成部署与容器化方案
  • 手机号查询QQ号实用指南:高效找回账号的实用技巧
  • 蜣螂算法(DBO)优化PID控制器:Matlab与Simulink联合仿真之旅
  • 从GeoJSON到立体模型:手把手教你用Cesium把静态行政区划图片‘立’起来
  • OpenClaw 的对话系统是否支持与制造执行系统(MES)集成?
  • nlp_structbert_sentence-similarity_chinese-large保姆级教程:Mac M1/M2芯片适配与Metal加速支持
  • Eclipse + GDB + J-Link 的嵌入式开发调试全流程解析
  • 快速原型实践:用快马平台十分钟搭建颜色代码转换器
  • Notion替代Jira:远程团队用AI项目管理省$300K
  • Winhance中文版:3个步骤让Windows系统性能提升40%的图形化工具
  • 终极QMC解密工具:3分钟快速解锁QQ音乐加密文件的完整指南
  • 缓存策略与 Spring Boot:2026 实战指南
  • 适用于任何行业金融理财源码带代理后台业务员单独统计
  • AnythingtoRealCharacters2511实测:上传动漫图片,3步生成逼真真人形象
  • 从神经网络到算力:揭秘AI核心底层技术,让你彻底搞懂AI“靠什么实现”!
  • 测试数据治理:一个让所有测试人员头疼的“脏活”
  • DFRobot URM07超声波传感器UART通信与温度补偿详解
  • 如何用Botty实现暗黑破坏神2智能自动化:零基础玩家的高效刷宝指南
  • 对于多轮对话中的对话策略鲁棒性,OpenClaw 的对抗训练方法?
  • 企业员工福利平台选型:技术架构与对接难点拆解
  • 3个技巧让你掌握网盘直链解析:突破下载限制的革新方案
  • 二叉树经典题型全攻略:从入门到进阶的10道必刷题
  • No.953 基于三菱PLC和MCGS单容液位控制组态设计程序 我们主要的后发送的产品有
  • 告别串口调试助手!用Chrome浏览器直接调试Arduino/STM32(Web Serial API实战)