C++初学者指南-5.标准库(第一部分)--顺序容器

C++初学者指南-5.标准库(第一部分)–顺序容器

文章目录

  • C++初学者指南-5.标准库(第一部分)--顺序容器
    • 标准顺序容器
    • 常见特点
      • 规律性:复制,分配,比较
      • 类型推导(C++17)
      • 常用接口部分
    • array<T,size>
    • vector\<T>
      • C++ 的默认容器
      • 快速回顾
      • 迭代器范围
      • 插入元素
      • 插入和原地构造(C++11)
      • 删除元素
      • 释放内存 / 释放空间
      • 注意!插入/删除之后!
      • Vector接口概览
    • deque\<T>
      • deque接口概览
    • list\<T>
      • list接口概览
    • forward_list\<T>
      • forward_list接口概览
    • 指导方针
    • 相关链接

标准顺序容器

在这里插入图片描述

array<T,size>固定尺寸连续数组
vector<T>动态连续数组;O(1)时间复杂度的增长策略;C++的“默认”容器。
deque<T>双向队列,可以快速的在两端插入和删除。
list<T>双向链表;O(1)时间复杂度的插入、删除和剪接;实际上通常比vector要慢。
forward_list单向链表;O(1)时间复杂度的插入、删除和剪接;比list需要更少的内存;实际上比vector要慢。

常见特点

规律性:复制,分配,比较

所有标准序列容器都是规则类型:

  • 深度复制:复制将创建一个新的容器对象并复制所有包含的值
  • 深度赋值:从源到目标的所有包含对象都会被复制
  • 深度比较:比较两个容器比较包含的对象
  • 深层所有权:销毁容器将销毁所有包含的对象

在这里插入图片描述

std::vector<int> a {4,7,1,9};
std::vector<int> b {1,2,3};
bool equal1 = (a == b);  // false
b = a;  // 复制赋值 ⇒ b: 4 7 1 9
bool equal2 = (a == b);  // true
a[0] = 3;     // a: 3 7 1 9     b: 4 7 1 9
bool equal3 = (a == b);  // false
// 制作精确复制品的不同方式,
// 用拷贝构造新容器
std::vector<int> a2 {a};
std::vector<int> a3 (a);
std::vector<int> a4 = a;
auto a5 {a};
auto a6 (a);
auto a7 = a;

类型推导(C++17)

从C++17开始,可以从构造函数调用中推断元素类型。

std::vector v {1, 2, 3, 4};std::vector<int>
std::vector v {1.f, 2.3f, 4.5f};std::vector<float>
std::vector v {1., 2.3, 4.6};std::vector<double>
struct p2 { int x; int y; };
std::vector v {p2{1,2}};std::vector<p2>

常用接口部分

正向遍历的迭代器

可以通过标准序列容器的成员函数从中获取:
container.begin() → @first_element
container.end() → @one_behind_last_element

或者使用独立函数: (C++11)
std::begin(container) → @first_element
std::end(container) → @one_behind_last_element

如果你不熟悉迭代器是什么,请参考这篇文章。

前向遍历的常量迭代器

可以通过标准序列容器的成员函数从中获取:
container.cbegin() → @first_element
container.cend() → @one_behind_last_element

或者使用独立函数: (C++11)
std::cbegin(container) → @first_element
std::cend(container) → @one_behind_last_element

空查询
要么用成员函数:
container.empty() → true, 如果容器没有元素
或者用独立函数:
std::empty(container) → true, 如果容器没有元素

类型接口

  • container::value_type
  • container::size_type
  • container::iterator
  • container::const_iterator
    ,
using con_t = std::vector<double>;
con_t::size_type i = 0;         // std::size_t
auto x = con_t::value_type{0};  // double

array<T,size>

  • 无开销随机存取
  • 快速遍历;适用于线性搜索
  • size 必须是常量表达式(= 编译时已知)
  • 不支持大小更改操作(调整大小、插入、擦除等)
  • 如果元素类型具有较高的复制/赋值开销(重新排序元素需要复制/移动它们),则可能会变慢

在这里插入图片描述
运行示例代码

vector<T>

C++ 的默认容器

在这里插入图片描述

  • 无开销随机存取
  • 快速遍历;适用于线性搜索
  • 以平摊常数时间插入
  • 如果在开头或随机位置频繁进行插入/删除操作,可能会变得很慢
  • 如果元素类型具有较高的复制/赋值开销(重新排序元素需要复制/移动它们),则可能会变慢
  • 所有可以改变容量的操作(插入,尾部添加,等等)可能会使任何向量元素的引用/指针失效
  • 对于非常大量的值,分配时间可能很长(可以缓解,看这里)

快速回顾

在这里插入图片描述
运行示例代码
在这里插入图片描述

迭代器范围

在这里插入图片描述
注意:迭代器范围的末尾迭代器 q 指向最后一个元素的后面的位置。

插入元素

【】在这里插入图片描述
迭代器范围

插入和原地构造(C++11)

在这里插入图片描述

删除元素

在这里插入图片描述
删除不会影响容量,也就是说,向量vector的任何内存都不会被释放。

释放内存 / 释放空间

从向量中删除元素永远不会改变容量,因此也永远不会释放任何内存。

.shrink_to_fit() (可能有效)

  • ISO标准并不要求它实际收缩
  • 标准库的实现可能决定不进行收缩
vector<int> v;
// add a lot of elements …
// erase elements …
v.shrink_to_fit(); C++11

保证有效:

  • 制作临时副本 ⇒ 副本恰好与元素相匹配
  • 通过交换/移动交换内存缓冲区
  • 临时的东西会自动销毁
vector<int> v;
// add a lot of elements …
// erase elements …
// shrink: make a new copy and
// replace v's content with it:
v = vector<int>(v);       C++11-20
// or:
v.swap( vector<int>(v) ); C++98-20

注意!插入/删除之后!

如果一个向量的容量被改变或元素被insert、push_back、emplace、emplace_back、erase、=、assign、resize、reserve等操作移动时,所有迭代器都会无效化。(交换两个向量的内容并不会使迭代器无效,除了末尾的迭代器。)
在这里插入图片描述
迭代器失效操作概览

操作无效的迭代器
只读操作
swap, std::swap仅在结束位置end()
reserve, shrink_to_fit如果容量改变了:全部无效。 否则:无
push_back, emplace_back如果容量变了:全部无效。 否则:只有end()
insert, emplace如果容量改变:全部无效 否则:仅在插入点或之后(包括末尾end())
resize如果容量改变:全部无效:只有 end() 和用于擦除的元素的迭代器
pop_back迭代器指向被删除元素和末尾位置
erase用于擦除元素及其后面所有元素的迭代器(包括. end())
clear, operator=, assign全部无效

Vector接口概览

在这里插入图片描述

deque<T>

双端队列 在这里插入图片描述

  • 常数时间的随机访问(极小的开销)
  • 快速遍历;适合线性搜索
  • 两端具有良好的插入和删除性能
  • 插入操作不会使元素的引用或指针失效
  • 如果随机位置的插入/删除操作占主导地位,可能会变得比较慢
  • 如果元素类型具有较高的复制/赋值开销(重新排序元素需要复制/移动它们),则可能会变慢
  • 大量值的分配可能需要很长时间(可以通过一些方法来缓解,参见这里)

在这里插入图片描述

deque接口概览

在这里插入图片描述

list<T>

双向链表
在这里插入图片描述

  • 重组操作不需要移动/复制元素(适合存储拷贝/赋值成本高的大对象)
  • 常量时间拼接(完整列表)
  • 只能在线性时间内进行随机访问
  • 由于内存局部性差,遍历速度慢
    在这里插入图片描述

list接口概览

在这里插入图片描述

forward_list<T>

前向链表
在这里插入图片描述

  • 比list占用更少的内存

  • 重组操作不需要移动/复制元素(适合存储拷贝/赋值成本高的大对象)

  • 常量时间拼接(完整列表)

  • 随机访问只能在线性时间内完成

  • 由于内存局部性不好,导致遍历速度慢

  • 只能向前遍历

  • 由于仅支持前向链接,接口有点复杂

    • 不能: size(), back(), push_back(), pop_back(), insert()
    • 替代: insert_after(), splice_after(), before_begin()

    在这里插入图片描述

forward_list接口概览

在这里插入图片描述

指导方针

我应该使用哪种顺序容器?
默认选择:std::vector !

在这里插入图片描述

相关链接

std::vector
cppreference: 容器库
一个C++容器和算法教程
5分钟5个数据结构

顺序容器概览表
在这里插入图片描述
附上原文链接

如果文章对您有用,请随手点个赞,谢谢!^_^

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

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

相关文章

【粉丝福利 | 第8期】值得收藏!推荐10个好用的数据血缘工具

⛳️ 写在前面参与规则&#xff01;&#xff01;&#xff01; ✅参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff0c;任意评论&#xff08;每人最多评论三次&#xff09; ⛳️本次送书1~4本【取决于阅读量&#xff0c;阅读量越多&#xff0c;送的越多】 目前市面上绝…

文档图像处理:大模型的突破与新探索

前言 随着数字化时代的到来&#xff0c;文档图像处理技术在各行各业扮演着越来越重要的角色。在2023第十二届中国智能产业高峰论坛&#xff08;CIIS 2023&#xff09;的专题论坛上&#xff0c;合合信息智能技术平台事业部副总经理、高级工程师丁凯博士分享了当前文档图像处理面…

如何学习和提升SQL

资料来源于腾讯技术直播&#xff0c;只作为学习记录&#xff0c;如有侵权&#xff0c;请联系作者进行删除

4.1 操作系统

大纲 进程管理重点&#xff0c;占本章历年考试一半分数&#xff0c; 前趋图、信号量和PV操作、死锁和银行家算法 出计算题 作业管理历年考试从来没有考过 操作系统概述 进程管理 进程的组成和状态 前趋图 进程资源图 真题 1

实验一 MATLAB \ Python数字图像处理初步

一、实验目的&#xff1a; 1&#xff0e;熟悉及掌握在MATLAB\Python中能够处理哪些格式图像。 2&#xff0e;熟练掌握在MATLAB\Python中如何读取图像。 3&#xff0e;掌握如何利用MATLAB\Python来获取图像的大小、颜色、高度、宽度等等相关信息。 4&#xff0e;掌握如何在M…

java花店管理系统eclipse开发mysql数据库

1 绪论 1.1 系统开发目的 随着人们物质生活水平和经济水平的不断提高&#xff0c;室内绿化布置、家庭园艺装饰、礼仪鲜花等日益受到重视和青睐&#xff0c;以及送鲜花给亲朋好友来表达自己的情谊。传统的花店对于信息的管理的主要方式是基于文本、表格等纸质手工处理&#xf…

SpringCloudAlibaba基础五 Nacos配置中心

一 Nacos配置中心介绍 官方文档&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config Nacos 提供用于存储配置和其他元数据的 key/value 存储&#xff0c;为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos C…

剪辑抽帧技巧有哪些 剪辑抽帧怎么做视频 剪辑抽帧补帧怎么操作 剪辑抽帧有什么用 视频剪辑哪个软件好用在哪里学

打破视频节奏&#xff0c;让作品告别平庸。抽帧剪辑可以改变视频叙事节奏&#xff0c;人为制造冲突、转折、卡顿的效果。这种剪辑方式&#xff0c;不仅可以推进剧情发展&#xff0c;还能吸引观众的注意力&#xff0c;有效防止观影疲劳。有关剪辑抽帧技巧有哪些&#xff0c;剪辑…

mysql数据库中的视图view的概念和详细说明

目录 一、定义 二、视图view的分类 &#xff08;一&#xff09;按功能和特性分类 1、普通视图&#xff08;Regular View/Standard View&#xff09; 2、索引视图&#xff08;Indexed View&#xff09; 3、分割视图&#xff08;Partitioned View/Distributed Partitioned …

1.认识微服务

认识微服务 1.微服务2.微服务架构 1.微服务 微服务是一种经过良好架构设计的分布式架构设计&#xff0c;微服务架构特征&#xff1a; 单一指职责&#xff1a;微服务拆分粒度更小&#xff0c;每一个服务都对应唯一的业务能力&#xff0c;做到单一职责&#xff0c;避免重复业务…

Python提取视频文案

Python提取视频文案 1、背景描述2、视频转音频3、音频转文字 1、背景描述 在多媒体应用中&#xff0c;视频是一个信息量巨大的载体。然而&#xff0c;有时我们需要从视频中提取语音并转换为文本&#xff0c;以用于文本分析和机器学习训练 其中主要涉及到两个过程&#xff1a;视…

LVS+Nginx高可用集群---Nginx进阶与实战(二)

1.Nginx配置SSL证书提供https访问 大概步骤&#xff1a;云服务器-注册域名-配置SSL证书-下载证书&#xff0c;并且拷贝到nginx的conf目录下。 检查nginx是否含有ssl的模块-安装ssl模块-配置HTTPS模块-配置SSL-主域名可以通过HTTPS访问 配置模版&#xff1a; 添加上开启SSL的代…

python-课程满意度计算(赛氪OJ)

[题目描述] 某个班主任对学生们学习的的课程做了一个满意度调查&#xff0c;一共在班级内抽取了 N 个同学&#xff0c;对本学期的 M 种课程进行满意度调查。他想知道&#xff0c;有多少门课是被所有调查到的同学都喜欢的。输入格式&#xff1a; 第一行输入两个整数 N , M 。 接…

微服务-初级篇

微服务-初级篇 认识微服务1.1 单体架构1.2 分布式架构1.3 微服务 SpringCloud2.1 了解2.2 服务拆分原则2.3 服务拆分效果 Nacos注册中心3.1 认识和安装Nacos3.1.1 Nacos下载3.1.2 Nacos安装 3.2 服务注册到Nacos Feign远程调用4.1 Feign引入4.2 Feign配置 认识微服务 1.1 单体…

LVS-DR负载均衡

LVS-DR负载均衡 LVS—DR工作模式 原理 客户端访问调度器的VIP地址&#xff0c;在路由器上应该设置VIP跟调度器的一对一的映射关系&#xff0c;调度器根据调度算法将该请求“调度“到后端真实服务器&#xff0c;真实服务器处理完毕后直接将处理后的应答报文发送给路由器&#xf…

数据库之索引(四)

目录 一、聚簇索引和非聚簇索引的区别 二、简述联合索引 三、SELECT IN 语句中如何使用索引 四、模糊查询语句中如何使用索引 一、聚簇索引和非聚簇索引的区别 在InnoDB存储引擎中&#xff0c;可以将BTree索引分为聚簇索引和辅助索引&#xff08;非聚簇索引&#xff09;。无…

66条AI共创文章润色秘诀,一键提升你的写作水平

猫头虎 &#x1f42f; 建联猫头虎&#xff0c;商务合作&#xff0c;产品评测&#xff0c;产品推广&#xff0c;个人自媒体创作&#xff0c;超级个体&#xff0c;涨粉秘籍&#xff0c;一起探索编程世界的无限可能&#xff01; 掌握这些提示词和指令&#xff0c;让你的AI创作更…

深入分析 Android BroadcastReceiver (三)

文章目录 深入分析 Android BroadcastReceiver (三)1. 广播消息的优缺点及使用场景1.1 优点1.2 缺点 2. 广播的使用场景及代码示例2.1. 系统广播示例&#xff1a;监听网络状态变化 2.2. 自定义广播示例&#xff1a;发送自定义广播 2.3. 有序广播示例&#xff1a;有序广播 2.4. …

Codesys 连接 EtherCAT 总线伺服

本文内容是根据参考视频做的笔记&#xff1a; EtherCAT Master 控制&#xff1a;https://www.bilibili.com/video/BV1L14y1t7ks/EtherCAT Master Motion 控制&#xff1a;https://www.bilibili.com/video/BV16P411j71E/ EtherCAT 总线简单介绍 从站站号&#xff1a;如果使用扫…

跟《经济学人》学英文:2024年6月29日这期 A new lab and a new paper reignite an old AI debate

A new lab and a new paper reignite an old AI debate Two duelling visions of the technological future 对技术未来的两个对立的愿景 reignite&#xff1a;美 [ˌriɪɡˈnaɪt] 重新点燃&#xff1b;重新激起 duel&#xff1a;美 [ˈduːəl] 决斗&#xff1b;对决&…