news 2026/4/22 2:12:38

C++容器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++容器

C++ 容器是标准模板库(STL)的核心组成部分,本质上是用于存储和组织数据的通用数据结构,它们被封装成模板类,支持不同类型的数据存储,无需你手动管理内存(大部分情况下)。

一、容器的分类

C++ STL 容器主要分为三大类,各自有不同的适用场景:

容器类型代表容器核心特点
序列式容器vector、list、deque元素按插入顺序排列,可通过位置访问,底层结构不同导致性能差异
关联式容器map/set、unordered_map/unordered_set元素按特定规则(排序 / 哈希)组织,查找效率高
容器适配器stack、queue、priority_queue基于基础容器封装,提供特定的访问规则(如栈的后进先出)

二、常用容器的基本用法

下面通过代码示例展示最常用容器的核心操作:

1. 序列式容器 - vector(最常用)

vector是动态数组,内存连续,随机访问快,尾部增删效率高,中间增删效率低。

cpp

运行

#include <iostream> #include <vector> // 包含vector头文件 using namespace std; int main() { // 1. 创建vector vector<int> vec; // 空的int类型vector vector<int> vec2(5, 10); // 初始化5个元素,每个值为10 // 2. 添加元素 vec.push_back(1); // 尾部添加元素1 vec.push_back(2); vec.push_back(3); // 3. 访问元素 cout << "通过下标访问:" << vec[0] << endl; // 下标访问(无越界检查) cout << "通过at访问:" << vec.at(1) << endl; // at访问(有越界检查,更安全) cout << "第一个元素:" << vec.front() << endl; cout << "最后一个元素:" << vec.back() << endl; // 4. 遍历元素 cout << "遍历vector:"; for (int i = 0; i < vec.size(); ++i) { cout << vec[i] << " "; } cout << endl; // 5. 删除元素 vec.pop_back(); // 删除尾部元素 cout << "删除尾部后大小:" << vec.size() << endl; // 6. 清空容器 vec.clear(); cout << "清空后是否为空:" << (vec.empty() ? "是" : "否") << endl; return 0; }

输出结果

plaintext

通过下标访问:1 通过at访问:2 第一个元素:1 最后一个元素:3 遍历vector:1 2 3 删除尾部后大小:2 清空后是否为空:是
2. 关联式容器 - map(键值对)

map是有序的键值对容器,键唯一,底层是红黑树,查找 / 插入 / 删除效率为 O (log n)。

cpp

运行

#include <iostream> #include <map> // 包含map头文件 #include <string> using namespace std; int main() { // 1. 创建map(键:string,值:int) map<string, int> scoreMap; // 2. 插入元素 scoreMap["张三"] = 90; scoreMap.insert(pair<string, int>("李四", 85)); scoreMap.insert({"王五", 95}); // 3. 访问元素 cout << "张三的分数:" << scoreMap["张三"] << endl; // 查找不存在的键会自动插入默认值(0),建议用find auto it = scoreMap.find("赵六"); if (it != scoreMap.end()) { cout << "赵六的分数:" << it->second << endl; } else { cout << "未找到赵六的分数" << endl; } // 4. 遍历map cout << "\n所有分数:" << endl; for (const auto& pair : scoreMap) { // 范围for循环 cout << pair.first << ":" << pair.second << endl; } // 5. 删除元素 scoreMap.erase("李四"); cout << "\n删除李四后,元素数量:" << scoreMap.size() << endl; return 0; }

输出结果

plaintext

张三的分数:90 未找到赵六的分数 所有分数: 李四:85 王五:95 张三:90 删除李四后,元素数量:2
3. 容器适配器 - stack(栈)

stack是后进先出(LIFO)的适配器,默认基于 deque 实现,只能访问栈顶元素。

cpp

运行

#include <iostream> #include <stack> // 包含stack头文件 using namespace std; int main() { stack<int> s; // 入栈 s.push(10); s.push(20); s.push(30); // 访问栈顶 cout << "栈顶元素:" << s.top() << endl; // 出栈 s.pop(); cout << "出栈后栈顶:" << s.top() << endl; // 栈的大小 cout << "栈的大小:" << s.size() << endl; // 判断是否为空 cout << "栈是否为空:" << (s.empty() ? "是" : "否") << endl; return 0; }

输出结果

plaintext

栈顶元素:30 出栈后栈顶:20 栈的大小:2 栈是否为空:否

三、容器选择的核心原则

  1. 如果需要随机访问(按下标快速取值)、尾部增删多 → 选vector
  2. 如果需要频繁在中间增删→ 选list(双向链表)
  3. 如果需要键值对存储、按键查找→ 有序选map,无序且追求更快查找 → 选unordered_map
  4. 如果需要去重→ 选set/unordered_set
  5. 如果需要先进先出(队列)→ 选queue后进先出(栈)→ 选stack

总结

  1. C++ 容器是 STL 的核心,分为序列式、关联式、容器适配器三类,适配不同的数据存储和访问场景。
  2. vector是最常用的序列式容器,适合随机访问;map适合键值对存储;stack/queue适合特定访问规则。
  3. 选择容器的核心依据是访问方式增删操作的位置 / 频率,优先选择匹配业务场景、效率更高的容器。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 20:34:54

内网横向渗透:攻击者的内网扩张术与企业全维度防御实战指南

在网络攻击攻防对抗日趋激烈的当下&#xff0c;企业外网边界防御体系&#xff08;如防火墙、WAF、蜜罐&#xff09;的不断完善&#xff0c;让攻击者突破外网的难度大幅提升。但一旦攻击者通过钓鱼邮件、漏洞利用、远程办公入口等方式实现初始访问&#xff0c;后续的内网横向渗透…

作者头像 李华
网站建设 2026/4/18 4:27:54

计算机毕设java的停车场管理系统 基于Java技术的智能停车场管理系统开发 Java驱动的停车场综合管理平台设计与实现

计算机毕设java的停车场管理系统0k5o89 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着城市化进程的加速&#xff0c;车辆数量不断增加&#xff0c;停车场管理成为城市交通管…

作者头像 李华
网站建设 2026/4/17 7:42:03

揭秘ES的BKD树索引:多维数据查询的加速引擎

在Elasticsearch的索引体系中&#xff0c;倒排索引&#xff08;Inverted Index&#xff09;是全文检索的基石&#xff0c;但面对数值范围查询、地理空间搜索等场景时&#xff0c;其性能短板逐渐显现。例如&#xff0c;当用户需要查询"价格在1000-5000元之间的商品"或…

作者头像 李华
网站建设 2026/4/17 19:10:17

用Qwen3-1.7B做AI助手,效果惊艳且成本极低

用Qwen3-1.7B做AI助手&#xff0c;效果惊艳且成本极低 1. 为什么你需要一个“能思考”的轻量级AI助手&#xff1f; 你有没有遇到过这些情况&#xff1a; 想在公司内部搭个智能客服&#xff0c;但发现主流大模型动不动就要24GB显存&#xff0c;连RTX 4090都跑得吃力&#xff…

作者头像 李华
网站建设 2026/4/21 17:40:24

开发技能学习打卡工具,设定技能学习时长,(如每天学一小时python),记录学习内容,时长,生成学习时长趋势图,连续打卡奖励标记。

技能学习打卡工具 - 全栈开发实践1. 实际应用场景描述本工具面向程序员、设计师、产品经理、学生等技能学习者&#xff0c;提供游戏化的学习打卡体验。在知识爆炸的时代&#xff0c;终身学习已成为必然&#xff0c;但坚持学习却是最难的挑战。典型使用场景&#xff1a;- 程序员…

作者头像 李华
网站建设 2026/4/17 19:59:56

用Paraformer做语音转写,长音频自动切分加标点超方便

用Paraformer做语音转写&#xff0c;长音频自动切分加标点超方便 关键词&#xff1a;Paraformer、语音识别、ASR、长音频处理、Gradio、离线语音转文字、标点预测、VAD端点检测 摘要&#xff1a;本文手把手带你用Paraformer-large离线语音识别镜像完成高质量中文语音转写。无需…

作者头像 李华