C++ 标准模板库各个容器的应用场景分析

 

C++ 标准模板库(STL)中的容器分为序列式容器、关联式容器和无序容器,各自适用于不同场景。以下是主要容器的应用场景及案例:

一、序列式容器

元素按插入顺序存储,支持线性访问。

1. vector
  • 场景:动态数组,随机访问频繁,尾部插入 / 删除多。
  • 特点:连续内存,自动扩容(倍增策略)。
  • 案例:存储用户信息列表。
#include <vector>
#include <string>
using namespace std;vector<string> userNames;
userNames.push_back("Alice");
userNames.emplace_back("Bob"); // 直接构造对象
cout << userNames[0]; // 随机访问
2. deque
  • 场景:双端队列,头尾插入 / 删除频繁。
  • 特点:分段连续内存,支持push_front()
  • 案例:任务调度队列。
#include <deque>
deque<int> tasks;
tasks.push_front(100); // 头部插入
tasks.pop_back();      // 尾部删除

                                

3. list
  • 场景:频繁插入 / 删除(任意位置),不关心随机访问。
  • 特点:双向链表,插入 / 删除 O (1)。
  • 案例:实现链表操作。
#include <list>
list<int> numbers = {1, 2, 3};
auto it = ++numbers.begin(); // 迭代器移动
numbers.insert(it, 10);      // 在位置插入
4. forward_list
  • 场景:单向链表,仅需前向遍历,节省空间。
  • 特点:单链表,无size(),插入 / 删除效率更高。
  • 案例:实现轻量级链表。
#include <forward_list>
forward_list<int> flist = {1, 2};
flist.push_front(0); // 仅支持头部操作

二、关联式容器

元素按键排序,支持快速查找(基于红黑树)。

1. set
  • 场景:存储唯一元素,自动排序,快速去重。
  • 特点:键即值,不允许重复。
  • 案例:存储单词集合。
#include <set>
set<string> words = {"apple", "banana"};
words.insert("apple"); // 重复元素被忽略
cout << words.count("apple"); // 输出1
2. map
  • 场景:键值对映射,按键排序,查找高效。
  • 特点:键唯一,基于红黑树。
  • 案例:统计单词频率。
#include <map>
map<string, int> wordCount;
wordCount["hello"]++; // 自动插入并计数
cout << wordCount["hello"]; // 输出1
3. multiset
  • 场景:允许重复元素的集合,按键排序。
  • 案例:存储考试分数(可重复)。
#include <multiset>
multiset<int> scores = {90, 85, 90};
cout << scores.count(90); // 输出2
4. multimap
  • 场景:一键多值的映射,如用户对应多个角色。
  • 案例:员工部门关系。
#include <multimap>
multimap<string, string> empDept;
empDept.insert({"Alice", "HR"});
empDept.insert({"Alice", "IT"}); // 同一键可对应多个值

三、无序容器

基于哈希表,元素无序,查找效率更高(平均 O (1))。

1. unordered_set
  • 场景:快速查找、去重,不关心顺序。
  • 案例:检查元素是否存在。
#include <unordered_set>
unordered_set<int> ids = {101, 202};
if (ids.find(101) != ids.end()) { /* 存在 */ }
2. unordered_map
  • 场景:键值对快速查找,如缓存、字典。
  • 案例:实现 URL 映射。
#include <unordered_map>
unordered_map<string, string> urlMap;
urlMap["/home"] = "index.html";
cout << urlMap["/home"]; // 快速查找
3. unordered_multiset 和 unordered_multimap
  • 场景:类似multisetmultimap,但无序。
  • 案例:存储社交网络中的多对多关系。

四、容器适配器

基于现有容器实现特定功能。

1. stack
  • 场景:后进先出(LIFO),如表达式求值、递归模拟。
  • 案例:括号匹配检查。
#include <stack>
stack<char> brackets;
for (char c : "({})") {if (c == '(') brackets.push(c);// ... 其他匹配逻辑
}
2. queue
  • 场景:先进先出(FIFO),如消息队列。
  • 案例:广度优先搜索(BFS)。
#include <queue>
queue<int> q;
q.push(1);
int front = q.front(); // 访问队首
q.pop(); // 出队
3. priority_queue
  • 场景:元素按优先级出队(默认大顶堆)。
  • 案例:任务调度(优先级高的先执行)。
#include <queue>
priority_queue<int> pq; // 大顶堆
pq.push(3);
pq.push(1);
cout << pq.top(); // 输出3

选择容器的建议

  1. 随机访问vectordeque
  2. 中间插入 / 删除list
  3. 键值对存储map(有序)或unordered_map(快速查找)。
  4. 去重 + 排序set
  5. 高效插入 / 删除:链表类容器(listforward_list)。
  6. 固定大小array(C++11,静态数组,性能略优)。

根据访问模式和操作频率选择合适的容器,可显著提升程序性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84114.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装前端vite框架,后端安装fastapi框架

前期准备 首先新建一个文件夹&#xff0c;文件夹里面新建一个文件夹&#xff0c;用于安装依赖 安装vite框架 npm init -y 目的是安装package.json配置文件 npm install vite --save-dev 安装vite框架 安装完是这个样子 新建了一个文件夹和js文件 后端内容 main.js document.…

深度学习:基础与概念(第1章:深度学习革命)

目录 第1章&#xff1a;深度学习革命 1.1深度学习的影响 1.1.1医疗诊断 1.1.2蛋白质结构预测 1.1.3图像合成 1.1.4大语言模型 1.2一个教学示例 1.2.1合成数据 1.2.2线性模型 1.2.3误差函数 1.2.4模型复杂度 1.2.5正则化 1.2.6模型选择 1.3机器学习简史 1.3.1单层…

通过触发器统计访问数据库的客户端IP地址

通过触发器统计访问数据库的客户端IP地址 创建用户登录审计表创建登录审计触发器查看登录审计结果禁用和启用触发器创建用户登录审计表 创建记录表: create table appuser1.user_login_audit (login_time DATE,session_id number,username VARCHAR2(30),os_user VARCHAR2(30…

在MCU上的1微秒的延迟实现方案及测量方法

运行环境&#xff1a; stm32h743iit6; 主频480MHz; APB1; 240MHz; TIM5 240MHz; 预分频系数为1; 定时器计数频率240MHz&#xff1b; 应用需求&#xff1a;实现软件模拟IIC&#xff0c;延迟精度2个微秒&#xff1b; 量变引起质变&#xff0c;当延迟粒度太小时&#xff0c;需要考…

macos电脑本地搭建mistral-7b大模型出现4-bit量化和缓存不足问题的记录

问题背景 本人想再本地笔记本电脑上搭建一个mistral-7b的大模型&#xff0c;在搭建的过程中&#xff0c;出现了4-bit量化模式无法处理的问题&#xff0c;以及电脑内存/显存不足的问题&#xff0c;导致无法搭建 电脑硬件信息 名称&#xff1a;2019 Mac book pro 内存&#xff1a…

C# 基础知识总结(带详细文字说明)

1. 基础语法结构 C# 程序由命名空间、类和方法组成。每个程序必须有一个 Main 方法作为入口点。using 指令用于导入命名空间&#xff0c;Console.WriteLine() 是常用的输出方法。 csharp 复制 下载 using System; // 引入核心命名空间class Program // 类定义 {static v…

C#最佳实践:为何要统一命名

C#最佳实践:为何要统一命名 在 C# 编程的世界里,代码就像是一座庞大的数字城市,而命名则是城市中纵横交错的街道名称与建筑标识。如果没有统一的命名规范,这座城市将陷入混乱,开发者在其中探索、维护代码时也会迷失方向。统一命名不仅是一种编程习惯,更是保障代码质量、…

通过后端连接Opengauss数据库的方法

文章目录 通过后端连接Opengauss数据库的方法一、为什么默认不能访问&#xff1f;二、要让普通用户从宿主机访问数据库&#xff0c;需要以下几个步骤&#xff1a;1. 使用 omm 超级用户登录数据库2. 创建一个应用程序专用用户&#xff0c;并设置密码3. 提供给应用程序专用用户对…

AWS Config:概述、优势以及如何开始?

在当今云原生架构快速发展的背景下&#xff0c;越来越多企业意识到资源配置管理和合规性审查的重要性。作为 AWS 官方授权代理商&#xff0c;在云上致力于为企业客户提供全面、可靠的云服务解决方案&#xff0c;帮助企业轻松上云、合规运营。本文将为您详细解读 AWS Config ——…

金融领域LLM开源测试集

BizFinBench 中文 金融业务场景基准数据集 结合迭代校准评估框架IteraJudge&#xff0c;对25个先进LLM进行全面评估&#xff0c;发现在金融AI领域与人类期望存在显著性能差距。 https://arxiv.org/pdf/2505.19457 https://github.com/HiThink-Research/BizFinBench/tree/m…

跨语言RPC:使用Java客户端调用Go服务端的JSON-RPC服务

在分布式系统开发中&#xff0c;不同编程语言之间进行通信是一个常见的需求。通过远程过程调用&#xff08;RPC&#xff09;技术&#xff0c;我们可以让不同的程序像调用本地方法一样调用远程的服务。本文将介绍如何使用Go语言编写一个简单的JSON-RPC服务&#xff0c;并使用Jav…

UE5 创建AI控制器、AI行为树和黑板

UE5 创建AI控制器、AI行为树和黑板 一、创建AI控制器AIController&#xff08;大脑&#xff09; 二、创建AI行为树和黑板 1&#xff1a;AI人工智能 2&#xff1a;行为树 3&#xff1a;黑板 三、AI行为树蓝图和添加黑板 1&#xff1a;添加黑板&#xff08;脑电波&#xff09;…

CDN加速导致CLS升高图片托管服务器的3个选择标准!

许多网站为了提升加载速度&#xff0c;会采用CDN加速服务分发图片等静态资源 这样做可能导致CLS&#xff08;累积布局偏移&#xff09;指标升高&#xff0c;拖累SEO评分。 这一问题通常源于CDN的异步加载机制或图片尺寸未预定义&#xff0c;使得页面布局在渲染过程中频繁变动。…

MySQL(77)如何设置自动备份任务?

设置自动备份任务可以确保你的数据库定期备份&#xff0c;防止数据丢失。以下是如何使用 Bash 脚本和 Cron 任务在 Linux 系统上设置 MySQL 数据库的自动备份任务的详细步骤和代码示例。 1. 编写备份脚本 首先&#xff0c;我们需要编写一个备份脚本。这个脚本将包含执行备份的…

.NET 开发中全局数据存储的几种方式

文章目录 一、静态类与静态成员实现方式特点优缺点 二、应用程序配置系统1. appsettings.json (ASP.NET Core)使用方式2. 用户设置 (WinForms/WPF)特点 三、依赖注入容器ASP.NET Core 示例特点 四、内存缓存 (IMemoryCache)实现方式特点 五、分布式缓存 (IDistributedCache)实现…

人才争夺战关键期,AI如何赋能招聘效率倍增、精准选拔

数智化转型浪潮席卷全球的今天&#xff0c;人才作为企业核心竞争力的地位日益凸显。而在传统招聘流程&#xff0c;尤其是面试环节正面临效率瓶颈、体验短板等多项挑战&#xff0c;典型如&#xff1a; 耗时冗长的筛选与安排&#xff1b;难以避免的主观评价偏差&#xff1b;海量…

介绍下分布式ID的技术实现及应用场景

什么是分布式ID 分布式ID是指在分布式系统中生成的特定范围内唯一的标识符&#xff0c;如订单号、商品ID、链路追踪TraceID。 随着业务发展&#xff0c;对分布式ID的要求越来越高&#xff0c;其中最基本的要求如下 全局唯一&#xff1a;在任何节点、任何时间生成的ID都必须是…

【leetcode-字母异位词分组】

排序法 public List<List<String>> groupAnagrams(String[] strs) {//最终值List<List<String>> result new ArrayList<>();//排序法HashMap<String,List<String>> map new HashMap<>(); //遍历strfor(String str : strs){/…

langchain从入门到精通(九)——ChatGPT/Playground手动模拟记忆功能

1. 摘要缓冲混合记忆 摘要缓冲混合记忆中&#xff0c;所需的模块有&#xff1a; chat_message_history&#xff1a;存储历史消息列表。moving_summary_buffer&#xff1a;移除消息的汇总字符串。summary_llm&#xff1a;生成摘要的 LLM&#xff0c;接收 summary&#xff08;当…

docker单点安装Hadoop

1、Docker中拉取jdk8镜像 拉取镜像 docker pull openjdk:8-jdk 查看jdk docker run -it openjdk:8-jdk bash which java 2、安装ubuntu源 拉取镜像 docker pull ubuntu:22.04 保存 docker save -o ubuntu-22.04.tar.gz ubuntu:22.04 移动到自己想要的目录 mv /roo…