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

news2024/9/24 19:24:42

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.coloradmin.cn/o/1915114.html

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

相关文章

微调Qwen2大语言模型加入领域知识

这里写自定义目录标题 试用Qwen2做推理安装LLaMA-Factory使用自有数据集微调Qwen2验证微调效果 试用Qwen2做推理 参考&#xff1a;https://qwen.readthedocs.io/en/latest/getting_started/quickstart.html from transformers import AutoModelForCausalLM, AutoTokenizer de…

短视频矩阵系统多账号搭建技术源码(saas开发者技术独立搭建)

在构建云服务环境以部署虚拟机方面&#xff0c;以Amazon Web Services&#xff08;AWS&#xff09;为示例&#xff0c;需采购并配置适当数量的EC2实例以及相关网络设施。 接下来&#xff0c;根据业务需求&#xff0c;应创建多个社交媒体平台如抖音和快手的官方账户&#xff0c;…

便宜SSL证书有哪些平台推荐 域名SSL证书作用

在数字化时代&#xff0c;网络安全已成为我们日常生活和工作中不可或缺的一部分。 申请便宜SSL证书步骤 1、登录来此加密网站&#xff0c;输入域名&#xff0c;可以勾选泛域名和包含根域。 2、选择加密方式&#xff0c;一般选择默认就可以了&#xff0c;也可以自定义CSR。 3…

css 自定义变量 var()

现在新版本的UI框架&#xff0c;基本使用CSS变量 css的一个函数&#xff1a;var()&#xff0c;此函数在有些场景下能优化不少代码量。 var() 介绍 借用下W3C的定义&#xff1a; var() 函数用于插入自定义的属性值&#xff0c;如果一个属性值在多处被使用&#xff0c;该方法就…

MySQL--函数、约束、多表查询

函数 函数指一段可以直接被另一段程序调用的程序或代码 字符串函数、数值函数、日期函数、流程函数 字符串函数 数值函数 日期函数 datediff&#xff08;date1,date2&#xff09;&#xff1a;date1-date2 流程函数 约束 概念&#xff1a;约束是作用于表中字段上的规则&…

半导体硅太阳能电池基板的湿化学处理及电子界面特性

硅(Si)在半导体器件制造中的大多数技术应用都是基于这种材料的特定界面性能。二氧化硅&#xff08;二氧化硅&#xff09;可以通过简单的氧化方法在硅表面制备&#xff0c;其特点是高化学和电稳定性。晶体硅在光伏应用占主导地位&#xff0c;全球近90%的太阳能电池生产是基于多晶…

携手并进 共创未来丨东软睿驰与中国移动上海产业研究院达成战略合作

2024年7月10日&#xff0c;东软睿驰与中国移动上海产业研究院(以下简称“上研院”)在沈阳隆重举行战略合作签约仪式。东软睿驰董事长兼CEO王勇峰、高级副总裁邢志刚与上研院董事长王建中、副总经理黄刚等领导出席签约仪式。 图为东软睿驰与上研院战略合作签约仪式现场 东软睿驰…

新手小白的pytorch学习第一弹-------张量

1 导入pytorch包 import torch2 创建张量&#xff08;tensor&#xff09; scalar标量 scalar torch.tensor(7) scalartensor(7)scalar.ndim查看scalar的维度&#xff0c;因为scalar是标量&#xff0c;所以维度为0 0scalar.shapetorch.Size([])torch.item()7vector&#xf…

Qt http网络编程

学习目标&#xff1a;Qt HTTP网络编程 学习内容 1、Http就是超文本传输协议(Hypertext Transfer Protocol)的缩写,它定义了浏览器和网页服务器之间的通信规范。是一个简单的请求一响应协议&#xff0c;它通常运行在 TCP 之上。 作用:规定 WWW 服务器与浏览器之间信息传递规范…

【卡尔曼滤波器】DR_CAN 2 学习笔记:_数据融合_协方差矩阵_状态空间方程_观测器问题

【卡尔曼滤波器】2_数学基础_数据融合_协方差矩阵_状态空间方程_观测器问题 非常重要1 数据融合 data fusion 有俩秤,各自有自己的正态分布:俩秤是相互独立的:俩秤都不准,但标准差都符合正态分布 正态分布又叫做高斯分布 向左、向右 都是2, 标准差是2覆盖了68.4 %的可能:…

Oracle RMAN增量备份

1、查询哪部分的增量 sql>set line 500 pages 0 sql>select sequence#,applied,first_change#||,next_change#||,to_char(completion_time,yyyy-mm-dd hh24:MI:SS) from v$archived_log where completion_time>sysdate-1; 2、rman备份(并行保存到指定路径) run{all…

GitLab CI/CD实现项目自动化部署

1 GitLab CI/CD介绍 GitLab CI/CD 是 GitLab 中集成的一套用于软件开发的持续集成&#xff08;Continuous Integration&#xff09;、持续交付&#xff08;Continuous Delivery&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;工具。这套系统允许开发团队…

org.springframework.boot.autoconfigure.EnableAutoConfiguration=XXXXX的作用是什么?

org.springframework.boot.autoconfigure.EnableAutoConfigurationXXXXXXX 这一配置项在 Spring Boot 项目中的作用如下&#xff1a; 自动配置类的指定&#xff1a; 这一配置将 EnableAutoConfiguration 设置为 cn.geek.javadatamanage.config.DataManageAutoConfiguration&…

react学习——25redux实现求和案例(完整版)

1、目录结构 2、count/index.js import React, {Component} from "react"; //引入store,用于获取数据 import store from ../../redux/store //引入actionCreator 专门创建action对象 import {createDecrementAction,createIncrementAction} from ../../redux/coun…

Linux基础知识(十六)shell脚本编程

一、简介 用户通过shell向计算机发送指令计算机通过shell给用户返回指令的执行结果 1.1 通过shell编程可以达到的效果 提高工作效率可以实现自动化 1.2 需要学习的内容 Linuxshell的语法规范 1.3 编写shell的流程 第一步&#xff1a;用vi/vim创建一个.sh的文件第二步&am…

利用原生JavaScript实现匹配搜索结果的网页内容高亮

昨天在用Anki的时候&#xff0c;复习笔记时想在笔记的解析里快速查找内容&#xff0c;于是探索了一下将匹配的搜索结果高亮。开始想不用第三方库直接实现&#xff0c;结果匹配的文本被HTML标签隔断时不能成功匹配&#xff0c;后来用到了jquery的mark.js库才简单实现。事后我想看…

vue中v-if与v-show的区别

在 Vue.js 中&#xff0c;v-if 和 v-show 都是用来控制元素显示与隐藏的指令&#xff0c;但它们之间有几个关键的区别&#xff1a; 直接上图 一. 条件渲染方式不同 v-if&#xff1a; 真正的条件渲染&#xff1a;v-if 指令会根据表达式的真假来销毁或重新创建 DOM 元素及其…

拟合衰减振动模型,估算阻尼比和阻尼系数

拟合衰减振动模型&#xff0c;估算阻尼比和阻尼系数 flyfish 衰减振动模型 在自由振动系统中&#xff0c;阻尼振动可以用以下公式描述&#xff1a; x ( t ) x 0 e − ζ ω n t cos ⁡ ( ω d t ϕ ) x(t) x_0 e^{-\zeta \omega_n t} \cos(\omega_d t \phi) x(t)x0​e−…

数据结构与算法-动态规划-三角形最小路径和

三角形最小路径和 给定一个三角形 triangle &#xff0c;找出自顶向下的最小路径和。 每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 1 的两个结点。也就是说&#xff0c;如果正位于当前行的下标 i &…

JUC并发编程-05:线程高级部分-源码解读

线程高级部分-源码解读 多线程高并发底层锁机制与优化最佳实践深入JDK源码理解LongAdder的分段CAS优化机制 公平锁和非公平锁原理解析 多线程高并发底层锁机制与优化最佳实践 深入JDK源码理解LongAdder的分段CAS优化机制 多个线程进入&#xff0c;为了防止空转&#xff0c;所…