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://xiahunao.cn/news/3227245.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

ZFT9-7VE8043-Z同期脉冲发送装置100V JOSEF约瑟 柜内安装

ZFT9(PIG)同期脉冲发送装置 系列型号 ZFT9(PIG) 7VE8033同期脉冲发送装置; ZFT9(PIG) 7VE8043同期脉冲发送装置; ZFT9 7VE8033同期脉冲发送装置; ZFT9 7VE8043同期脉冲发送装置; 用途&#xff1a; ZFT9同期脉冲发送装置用于船舶的三相系统&#xff0c;根据发电机和电力系…

985研究生8年终毕业,学位证颁发11天后被作废?

“正常是学校颁证给学院&#xff0c;但学院就没告诉我&#xff0c;还把学校颁发的证书给撤销了&#xff0c;这中间学院并没有书面或电话告知我本人。”34岁读研&#xff0c;如今已42岁的内蒙古任女士回想起求学不易&#xff0c;很是心酸。 2015年3月&#xff0c;任女士考取2015…

用微信服务号支付门诊缴费

时间上午10刚过&#xff0c;医院里计价收费处排起了长龙&#xff0c;放眼望去&#xff0c;左边的窗口六条队。右边在原来发药的位置也开辟了收费窗口&#xff0c;数了一下有四条队。一共十条排队付费的长龙&#xff0c;每一条队伍的人数不下20人&#xff0c;也即超过200人在排队…

第一关:Linux基础知识

Linux基础知识目录 前言LinuxInternStudio 关卡1. InternStudio开发机介绍2. SSH及端口映射2.1 什么是SSH&#xff1f;2.2 如何使用SSH远程连接开发机&#xff1f;2.2.1 使用密码进行SSH远程连接2.2.2 配置SSH密钥进行SSH远程连接2.2.3 使用VScode进行SSH远程连接 2.3. 端口映射…

SpringCloudAlibaba Nacos配置中心与服务发现

目录 1.配置 1.1配置的特点 只读 伴随应用的整个生命周期 多种加载方式 配置需要治理 1.2配置中心 2.Nacos简介 2.1特性 服务发现与服务健康检查 动态配置管理 动态DNS服务 服务和元数据管理 3.服务发现 1.配置 应用程序在启动和运行的时候往往需要读取一些配置信…

Stable Diffusion【ControlNet】:tile模型预处理器详解

今天我们重点对tile模型的预处理器进行一个详细的讲解。 一. Tile模型预处理器介绍 点击ControlNet插件Tile模型下的预处理下拉菜单&#xff0c;会看到Tile模型对应的预处理器有几个选项。 blur_gaussian&#xff1a;高斯模糊&#xff0c;主要用于调整景深用的 tile_colorfi…

什么是源代码加密?如何给源代码加密?

在软件开发领域&#xff0c;源代码的安全问题也日益凸显。源代码一旦泄露&#xff0c;不仅可能导致企业的技术优势丧失&#xff0c;还可能引发法律纠纷和财务损失。我们在了解源代码加密时&#xff0c;首先要了解什么是源代码加密&#xff1f; 什么是源代码加密&#xff1f; 源…

DFT: Parameter-Efficient Fine-Tuning with Discrete Fourier Transform

文章汇总 动机 相比LoRA&#xff0c;进一步压缩可训练参数以进行微调LFMs。 效果如下&#xff1a; 解决办法 相比LoRA&#xff0c;这里的 Δ W \Delta W ΔW为 E ∈ R 2 n E\in \mathbb R^{2\times n} E∈R2n和 c ∈ R n c\in \mathbb R^n c∈Rn。对于所有 L L L个适应层&…

JAVASE进阶day08(Map双列集合)

HashMap 1.HashMap基本使用 package com.lu.day08.map;import java.util.HashMap; import java.util.Map; import java.util.Set;public class MapDome {public static void main(String[] args) {HashMap<String , String> map new HashMap<>();//添加后者修改-…

一个简单的 Vue 组件例子

https://andi.cn/page/621509.html

每日一练 - RSTP根桥选举机制

01 真题题目 在如图所示的网络中&#xff0c;三台交换机运行 RSTP&#xff0c;配置情况如图所示。根据图中配置情况&#xff0c;判断根交换机为: A.SWA B.SWB C.SWC D.无法确定 02 真题答案 A 03 答案解析 根据RSTP的根桥选举原则&#xff0c;优先级越低的交换机越有可能成…

【前端】面试八股文——meta标签

【前端】面试八股文——meta标签 在HTML文档中&#xff0c;meta标签是一个关键但常被忽视的元素。它位于文档的<head>部分&#xff0c;用于提供关于HTML文档的元数据&#xff08;metadata&#xff09;。这些元数据不会直接显示在页面上&#xff0c;但对搜索引擎优化&…

Linux之免费证书工具certbot安装和使用

一、cerbot简介 Certbot是一个免费的开源软件工具&#xff0c;用于在手动管理的网站上自动使用Let’s Encrypt证书以启用HTTPS。要想让自己的网站启用https协议&#xff0c;需要一个由CA&#xff08;数字证书认证机构&#xff09;颁发的&#xff0c;能够让各个浏览器都能承认的…

mount卡住(失败)解决方案

mount -a卡主 第一步确保两边都打开了NFS服务&#xff01;&#xff01;&#xff01;&#xff01; 客户端执行mount -av 查看信息是拒绝服务 查看服务端&#xff1a;showmount -e 192.168.25.168 看提示信息处理&#xff0c;关闭两端的防火钱 遇到这个错误就是服务端不让客户端…

大模型是这样炼成的

原文链接&#xff1a; 大模型是这样训练的 AI因你而升温&#xff0c;记得加个星标哦&#xff01; 大家好&#xff0c;我是泰哥。距离上次写技术贴已经1年有余&#xff0c;这一年当中算法技术的发展可以说是日新月异。今天和大家聊聊大模型的训练的三个阶段&#xff0c;分别为有…

绝区零启动遇到的问题

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ​ 绝区零》作为米哈游的一款全新都…

盒马鲜生礼品卡如何处理?

前两天商场活动&#xff0c;买够一定面额的商品送一张一百的盒马卡 搜了下 盒马鲜生礼品卡可直接在线下或线上盒马超市购物时使用。 但是一百块钱的卡也买不了太多东西&#xff0c;反而最后还要补差价 最后我直接在收卡云上把卡卖出去了&#xff0c;100块钱面值卖了93.2&…

原理和组成

能力要素&#xff1a;&#xff08;1&#xff09;人员要素&#xff1a;“正确选人”。&#xff08;2&#xff09;过程要素&#xff1a;“正确做事”。&#xff08;3&#xff09;技术要素&#xff1a;“高效做事”。&#xff08;4&#xff09;资源要素&#xff1a;“保障做事”。…

凌风云 - 十大网盘资源搜索 Ver 6.0 版正式上线

《凌风云》作为网盘资源专业搜索领域的佼佼者&#xff0c;汇聚了国内十大网盘的丰富资源&#xff0c;凌风云搜索弥补其他搜索引擎可能无法搜索到相关资源的缺陷&#xff0c;作为专业的搜索引擎服务网络平台&#xff0c;您只需输入关键词&#xff0c;通过智能算法精准匹配&#…

群辉NAS同步Android手机日历日程

目录 一、安装套件 二、手机导出日历日程 三、NAS套件导入日历 四、获得DAVx5登陆链接 五、手机配置 六、验证 上一篇文章我们解决了Android手机与群辉NAS的通讯录的同步,这期我们说说如何同步Android手机的日历中的日程到群辉NAS。 看过上篇文章的伙伴知道,Android需要…