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

深入理解C++ 容器类

承接Qt/C++软件开发项目,高质量交付,灵活沟通,长期维护支持。需求所寻,技术正适,共创完美,欢迎私信联系!

引言

        C++ 标准库提供了丰富的容器(container)类型,用于存储和管理数据。这些容器不仅简化了编程工作,还提供了高效的数据管理和操作方法。本文将详细介绍 C++ 中常见的标准容器类,包括顺序容器、关联容器以及无序关联容器,并探讨它们的特点、使用场景及性能表现。

1. 顺序容器(Sequence Containers)

        顺序容器是按照插入顺序存储元素的容器。它们支持随机访问、前向迭代和后向迭代。主要的顺序容器有 std::vector、std::deque、std::list 和 std::forward_list。

1.1 std::vector

  • 特点:动态数组,支持快速随机访问。
  • 优点:
    • 连续内存分配,访问速度快。
    • 支持高效的尾部插入和删除操作。
  • 缺点:插入或删除中间元素效率较低,因为需要移动其他元素。
  • 适用场景:当你需要快速访问和频繁在尾部插入/删除元素时。
  • 示例代码:
#include <iostream>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};vec.push_back(6); // 尾部插入for (const auto& elem : vec) {std::cout << elem << " ";}return 0;
}

1.2 std::deque(双端队列)

  • 特点:两端都可以高效地插入和删除元素。
  • 优点:
    • 支持快速的前端和尾端插入/删除操作。
    • 内存块不连续,但对用户透明。
  • 缺点:随机访问比 std::vector 慢。
  • 适用场景:需要频繁在两端进行插入和删除操作。
  • 示例代码: 
#include <iostream>
#include <deque>int main() {std::deque<int> dq = {1, 2, 3};dq.push_front(0); // 前端插入dq.push_back(4);  // 尾部插入for (const auto& elem : dq) {std::cout << elem << " ";}return 0;
}

1.3 std::list(双向链表)

  • 特点:双向链表,支持快速的任意位置插入和删除。
  • 优点:插入和删除操作的时间复杂度为 O(1),前提是已有迭代器指向插入点。
  • 缺点:随机访问效率低。
  • 适用场景:需要频繁在任意位置插入和删除元素。
  • 示例代码:
#include <iostream>
#include <list>int main() {std::list<int> lst = {1, 2, 3};lst.insert(lst.begin(), 0); // 在开头插入lst.push_back(4);           // 在结尾插入for (const auto& elem : lst) {std::cout << elem << " ";}return 0;
}

1.4 std::forward_list(单向链表)

  • 特点:单向链表,节省内存,只支持前向遍历。
  • 优点:更少的内存开销,适用于只需要前向遍历的情况。
  • 缺点:不支持双向遍历。
  • 适用场景:当只需要前向遍历且希望节省内存时。
  • 示例代码:
#include <iostream>
#include <forward_list>int main() {std::forward_list<int> flst = {1, 2, 3};flst.push_front(0); // 在开头插入for (auto it = flst.begin(); it != flst.end(); ++it) {std::cout << *it << " ";}return 0;
}



2. 关联容器(Associative Containers)

        关联容器以键值对的形式存储数据,并根据键自动排序。主要的关联容器有 std::set、std::map、std::multiset 和 std::multimap。

2.1 std::set

  • 特点:键唯一,自动排序。
  • 优点:查找、插入和删除操作的时间复杂度为 O(log n)。
  • 适用场景:需要保证元素唯一性和有序性。
  • 示例代码:
#include <iostream>
#include <set>int main() {std::set<int> s = {5, 1, 3, 2, 4};for (const auto& elem : s) {std::cout << elem << " ";}return 0;
}


2.2 std::map

  • 特点:键值对,键唯一,自动排序。
  • 优点:快速查找、插入和删除操作。
  • 适用场景:需要键值映射关系,并且键必须唯一。
  • 示例代码:
#include <iostream>
#include <map>int main() {std::map<std::string, int> m = {{"apple", 1}, {"banana", 2}};m["orange"] = 3;for (const auto& [key, value] : m) {std::cout << key << ": " << value << "\n";}return 0;
}

2.3 std::multiset

  • 特点:允许重复键,自动排序。
  • 适用场景:允许相同元素存在,并保持有序性。
  • 示例代码: 
#include <iostream>
#include <set>int main() {std::multiset<int> ms = {1, 2, 2, 3};for (const auto& elem : ms) {std::cout << elem << " ";}return 0;
}

2.4 std::multimap

  • 特点:键值对,允许重复键,自动排序。
  • 适用场景:允许多个键映射到同一个值,并保持有序性。
  • 示例代码: 
#include <iostream>
#include <map>int main() {std::multimap<int, std::string> mm = {{1, "apple"}, {1, "orange"}, {2, "banana"}};for (const auto& [key, value] : mm) {std::cout << key << ": " << value << "\n";}return 0;
}


3. 无序关联容器(Unordered Associative Containers)

        无序关联容器也以键值对形式存储数据,但不保证任何特定顺序。主要的无序关联容器有 std::unordered_set、std::unordered_map、std::unordered_multiset 和 std::unordered_multimap。

3.1 std::unordered_set

  • 特点:键唯一,不保证顺序。
  • 优点:平均查找、插入和删除操作的时间复杂度为 O(1)。
  • 适用场景:需要快速查找、插入和删除操作,但不需要有序性。
  • 示例代码: 
#include <iostream>
#include <unordered_set>int main() {std::unordered_set<int> us = {1, 2, 3, 4, 5};for (const auto& elem : us) {std::cout << elem << " ";}return 0;
}

3.2 std::unordered_map

  • 特点:键值对,键唯一,不保证顺序。
  • 优点:平均查找、插入和删除操作的时间复杂度为 O(1)。
  • 适用场景:需要快速查找、插入和删除操作,但不需要有序性。
  • 示例代码:
#include <iostream>
#include <unordered_map>int main() {std::unordered_map<std::string, int> um = {{"apple", 1}, {"banana", 2}};um["orange"] = 3;for (const auto& [key, value] : um) {std::cout << key << ": " << value << "\n";}return 0;
}

3.3 std::unordered_multiset

  • 特点:允许重复键,不保证顺序。
  • 适用场景:允许相同元素存在,但不需要有序性。
  • 示例代码: 
#include <iostream>
#include <unordered_set>int main() {std::unordered_multiset<int> ums = {1, 2, 2, 3};for (const auto& elem : ums) {std::cout << elem << " ";}return 0;
}

3.4 std::unordered_multimap

  • 特点:键值对,允许重复键,不保证顺序。
  • 适用场景:允许多个键映射到同一个值,但不需要有序性。
  • 示例代码: 
#include <iostream>
#include <unordered_map>int main() {std::unordered_multimap<int, std::string> umm = {{1, "apple"}, {1, "orange"}, {2, "banana"}};for (const auto& [key, value] : umm) {std::cout << key << ": " << value << "\n";}return 0;
}


总结

        C++ 标准库中的容器类为开发者提供了强大的工具来管理数据。选择合适的容器类型取决于具体的应用需求,例如是否需要有序性、是否允许重复元素、是否需要快速的查找和插入等。通过合理选择和使用这些容器,可以编写出更高效、更易维护的代码。

相关文章:

深入理解C++ 容器类

承接Qt/C软件开发项目&#xff0c;高质量交付&#xff0c;灵活沟通&#xff0c;长期维护支持。需求所寻&#xff0c;技术正适&#xff0c;共创完美&#xff0c;欢迎私信联系&#xff01; 引言 C 标准库提供了丰富的容器&#xff08;container&#xff09;类型&#xff0c;用于存…...

优化 invite_codes 表的 SQL 创建语句

-- auto-generated definition create table invite_codes (id int auto_incrementprimary key,invite_code varchar(6) not null comment 邀请码&#xff0c;6位整数&#xff0c;确保在有效期内…...

springboot容器无法获取@Autowired对象,报null对象空指针问题的解决方式

示例错误代码&#xff1a; package com.uniin.ib.provider.iot.handle;Slf4j Component public class FireStringInboundHandler extends ChannelInboundHandlerAdapter {Autowiredprivate RsFireMonitoringMapper rsFireMonitoringMapper;Autowiredprivate RsFireAlertMapper…...

服务器数据恢复—Lustre分布式文件系统下服务器节点进水的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 5台节点服务器&#xff0c;每台节点服务器上有一组RAID5阵列。每组RAID5阵列上有6块硬盘&#xff08;其中1块硬盘设置为热备盘&#xff0c;其他5块硬盘为数据盘&#xff09;。上层系统环境为Lustre分布式文件系统。 机房天花板漏水导致…...

由于这些关键原因,我总是手边有一台虚拟机

概括 虚拟机提供了一个安全的环境来测试有风险的设置或软件,而不会影响您的主系统。设置和保存虚拟机非常简单,无需更改主要设备即可方便地访问多个操作系统。运行虚拟机可能会占用大量资源,但现代 PC 可以很好地处理它,为实验和工作流程优化提供无限的可能性。如果您喜欢使…...

word无法创建工作文件,检查临时环境变量。

word无法创建工作文件&#xff0c;检查临时环境变量。 word preview版本&#xff0c;关联打开文件出现报错。word无法创建工作文件&#xff0c;检查临时环境变量。 打开注册表&#xff0c;删除键 Word Preview: HKCR\CLSID{84F66100-FF7C-4fb4-B0C0-02CD7FB668FE} PowerPoint …...

照亮技术传播之路:构建卓越的技术文档

照亮技术传播之路&#xff1a;构建卓越的技术文档 引言 在信息技术快速发展的今天&#xff0c;技术文档作为沟通开发者、用户以及其他利益相关者的桥梁&#xff0c;其重要性不言而喻。一份优秀的技术文档不仅能够帮助团队成员理解项目背景和技术细节&#xff0c;还能够在产品…...

20241225在ubuntu20.04.5下监控SSD

20241225在ubuntu20.04.5下监控SSD 2024/12/25 20:29 参考资料&#xff1a; 百度&#xff1a;ubuntu查看ssd寿命 方法 1&#xff1a;使用「磁盘」工具监测 SSD 健康状态 sudo apt install gnome-disk-utility 方法 2&#xff1a;使用 smartctl 工具检查 SSD 健康状态 Ubuntu 和…...

Flink定时器

flink的定时器都是基于事件时间&#xff08;event time&#xff09;或事件处理时间&#xff08;processing time&#xff09;的变化来触发响应的。对一部分新手玩家来说&#xff0c;可能不清楚事件时间和事件处理时间的区别。我这里先说一下我的理解&#xff0c;防止下面懵逼。…...

《算力互联互通标准体系1.0》发布,为算力互联成网发展提供指导框架

2024年政府工作报告提出&#xff1a;“适度超前建设数字基础设施&#xff0c;加快形成全国一体化算力体系&#xff0c;培育算力产业生态”。因此提供普惠化算力服务、培育算力大市场的算力互联网体系是响应国家布局的重要路径。 我国算力产业发展已取得突破性进展&#xff0c;…...

视频监控平台:Liveweb视频汇聚融合平台智慧安防视频监控应用方案

Liveweb是一款功能强大、灵活部署的安防视频监控平台&#xff0c;支持多种主流标准协议&#xff0c;包括GB28181、RTSP/Onvif、RTMP等&#xff0c;同时兼容海康Ehome、海大宇等厂家的私有协议和SDK接入。该平台不仅提供传统安防监控功能&#xff0c;还支持接入AI智能分析&#…...

STM32串口第一次接收数据时第一个字节丢失的问题

解决方法&#xff1a;开启中断之前&#xff0c;先清除标志位【1】。 串口清除标志位&#xff1a; __HAL_UART_CLEAR_PEFLAG(&huart1); HAL_UART_Receive_IT(&huart1,&RxUart, 1); 定时器清除标志位&#xff1a; __HAL_TIM_CLEAR_FLAG(&htim3,TIM_FLAG_UPDATE);…...

Zookeeper基本命令解析

ZooKeeper -server host:port -client-configuration properties-file cmd args addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE addauth scheme auth 一、整体命令格式 ZooKeeper -serve…...

RustDesk远程及自建服务器搭建教程

要开始使用RustDesk远程和自建服务器&#xff0c;你需要遵循以下步骤&#xff1a; 下载和安装RustDesk&#xff1a;RustDesk是一款开源的远程支持应用程序。你可以在其官方网站&#xff08;https://rustdesk.com/&#xff09;上下载适用于你的操作系统的安装程序。安装过程非常…...

广州大彩串口屏安卓/linux触摸屏四路CVBS输入实现同时显示!

一、适用范围 适合广州大彩A40系列产品 产品型号&#xff1a; 二、概述 CVBS只需要一条线缆即可完成视频信号的传输&#xff0c;具有兼容性强、使用简单、成本低廉等优点。典型分辨率为720x480&#xff08;NTSC制&#xff09;或720x576&#xff08;PAL制&#xff09;。 三、…...

Python:模拟(包含例题)

模拟题&#xff1a;直接按照题目含义模拟即可&#xff0c;一般不涉及算法 注意&#xff1a; 1.读懂题&#xff1a;理清楚题目流程 2.代码和步骤一一对应&#xff1a;变量名&#xff0c;函数名&#xff0c;函数功能 3.提取重复的部分&#xff0c;写成对应的函数&#xff08;…...

Python OCR 文字识别

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…...

阿里巴巴2017实习生笔试题(二)

阿里巴巴2017实习生笔试题&#xff08;二&#xff09; 2024/12/25 1.下面哪一个不是动态链接库的优点&#xff1f; B A.共享 B.装载速度快 C.开发模式好 D.减少页面交换 解析 1 静态链接库的优点 (1) 代码装载速度快&#xff0c;执行速度略比动态链接库快&#xff1b;…...

Docker安装与使用

文章目录 0.关键词1.安装docker2.镜像和容器3.Docker基础1.常见命令2.数据卷&#xff08;volume&#xff09;要解决的问题&#xff1a;什么是数据卷&#xff1a;解决的办法&#xff1a; 3.数据卷的使用基本命令挂载数据卷&#xff08;nginx&#xff09;基于本地目录数据挂载&am…...

通过nginx设置一个图片服务器,并使用 Nginx 作为反向代理

通过nginx设置一个图片服务器&#xff0c;并使用 Nginx 作为反向代理 安装nginx 首先需要去官网下载一个nginx&#xff0c;我这里下载了最新的稳定版本&#xff1a;nginx-1.26.2&#xff0c;下载下来是一个压缩包&#xff0c;解压之后就可以直接用了。 修改nginx的配置文件 …...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...