【C++】序列与关联容器(二)序列容器

news2024/12/27 13:26:44

【C++】序列与关联容器(二)序列容器

  • 一、C++ 标准库中的序列容器模板
  • 二、array 容器模板
  • 三、vector元素模板

一、C++ 标准库中的序列容器模板

每种容器的实现方法的难易不同,特性不同,适用的应用场景不同

  • array :元素个数固定的序列容器(不支持对象的增添删除)
  • vector :元素连续存储的序列容器(每一个数据的地址完全连续,在一个连续的空间内存储)
  • forward_list / list :基于链表 / 双向链表的容器(每一个数据都不连续,通过内部指针连接在一起)
  • deque :vector 与list 的折衷(有多段,每一段之间通过指针联系在一起,段内是一段连续的内存空间)
  • basic_string :提供了对字符串专门的支持

上述容器都是模板,都需要使用元素类型来实例化容器模板,从而构造可以保存具体类型的容器。
不同的容器所提供的接口大致相同,但根据容器性质的差异,其内部实现与复杂度不同。
对于复杂度过高的操作,提供相对较难使用的接口或者不提供相应的接口

二、array 容器模板

具有固定长度的容器,其内部维护了一个内建数组,与内建数组相比提供了复制操作

 std::array<int,3> x={};
 std::array<int,3> y=x;//支持数组复制操作

由于array是固定长度容器,不支持后期删除或者增添元素,所以必须要在定义的时候就给出长度参数。

提供的接口:

  • 构造
    缺省初始化:可能会导致数组中的值是乱的。一般不建议这样做。
 std::array<int,3> x;

赋值初始化:

 std::array<int,3> x={3};
  • 元素访问:[],at,front,back,data
   std::array<int, 3> x = {1,2,3};
   std::cout << x[2] << std::endl; //3
   std::cout << x.at(2) << std::endl; //3
   std::cout << x.front() << std::endl; //打印首个元素 1
   std::cout << x.back() << std::endl; //打印最后一个元素 3
   std::cout << x.data()<< std::endl; //.data操作返回的是 T*,也就是该数组的首地址。这个和智能指针的get()用法是一个意思。由于智能指针以及array数组都不是普通的数据类型,而是一个模板类,所以其本身不是一个指针,需要用特定的命令获取纯的数据类型指针,就要用到这样的命令。

关于上面程序代码最后一行提到的data命令:array,vector这些都有,基本上如果是连续保存的数据类型就会有,而分散保存的,比如list就不会有。

  • 容量相关(平凡实现):empty,size
 std::array<int, 3> x = {1,2,3};
 std::cout << x.empty() << std::endl; //输出0,因为不是empty
 std::cout << x.size() << std::endl;  //3
 std::array<int, 0> y ;
 std::cout << y.empty() << std::endl; //输出1,因为是empty
 
  • 填充与交换:fill,swap
 std::array<int, 3> x ;
 x.fill(100); //把x中所有元素全部赋值为100
 std::array<int, 3> x={1,2,3} ;
 std::array<int, 3> y={4,5,6} ;
 x.swap(y); //把x与y中的元素交换,此时x={4,5,6},y={1,2,3}.
  • 比较操作:<=>
    比较数组内元素的每一个值的大小。
  • 迭代器

三、vector元素模板

vector 容器模板:元素可变
在这里插入图片描述
提供的接口:与array 很类似,但有其特殊性

  • 容量相关接口:capacity / reserve / shrink_to_fit

reserve的用法: 像下面这样给一个vector赋值,是没有问题的,但是系统性能太慢。原因是vector是动态分配内存,这样会经常出现已经给vector分配的内存满了,然后需要分配新的更大的内存,再拷贝过去,在新的内存上增添数据这样的情况。

 std::vector<int> x;
 for (int i = 0; i < 1024; ++i)
{
    x.push_back(i);
}

所以引入reserve用法:
使用reserve 的情况仅限于已知要给vector存入多少数据的情况。
在这种情况下,在给vector赋值对象数据之前,先调用x.reserve(1024);,此处的1024就是你想给vector存多少数据的那个值,他就会自动先分配1024个数据大小的内存空间,则后面赋值的时候就不会出现内存不够,分配新内存,再拷贝的情况,大大节省了系统性能,也提高了运行速度。

std::vector<int> x;
x.reserve(1024);
for (int i = 0; i < 1024; ++i)
{
    x.push_back(i);
}

shrink_to_fit用法:
还是由于vector是动态分配内存,且前文提到过,系统的机制是存一个数他会开辟两个数据大小的内存空间。所以常会出现已经存完数据了,但是系统给vector分配的内存空间还没有用完,就像前文的图所示。这时用到shrink_to_fit用法,传入的参数是该vector的实际大小,使得系统在其他地方重新开辟一块这个大小的内存空间,把数据拷贝过去,把原来的内存空间释放掉。该命令是为了节省内存空间。

  • 附加元素接口:push_back / emplace_back
    emplace_back在某些情况下会比push_back效率更高,性能更好(具体是在string类型的vector时可能更好)
  • 元素插入接口:insert / emplace
  • 元素删除接口:pop_back(弹出最后一个) / erase(弹出某一个) / clear (清楚全部)

注意:

  • vector 不提供push_front / pop_front ,可以使用insert / erase 模拟,但效率不高
  • 与array相比,vector的swap 效率较高
  • 写操作可能会导致迭代器失效

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

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

相关文章

11.4.软件系统分析与设计-算法的分析与设计

算法的分析与设计 涉及到的考点&#xff1a; C语言数据结构(树、链表)–考的不多时间复杂度和空间复杂度的计算排序算法四大经典算法 程序设计语言的基本成分 数据成分&#xff1a;指一种程序设计语言的数据和数据类型。数据分为常量&#xff08;程序运行时不可改变&#x…

让IP实现https访问的方法

IP SSL证书是主要保护公网ip地址的一种专属信任SSL证书&#xff0c;相比而言IP SSL证书体现的定位很明确。 IP SSL证书是一种数字证书&#xff0c;用于保护网络服务器和网络浏览器之间的通信。它是由受信任的证书颁发机构(CA)颁发的安全套接字层(SSL)证书。证书用于验证服务器…

day 26网络编程—协议

1、协议&#xff1a;通信双方约定的一套标准 2、国际网络通信协议标准&#xff1a; 1.OSI协议&#xff1a; 应用层 发送的数据内容 表示层 数据是否加密 会话层 是否建立会话连接 传输层 数据传输的…

丑数的计算

丑数 就是只包含质因数 2、3 和 5 的正整数。 给你一个整数 n &#xff0c;请你判断 n 是否为 丑数 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;n 6 输出&#xff1a;true 解释&#xff1a;6 2 3 示…

Linux---DHCP和FTP(原理+实操)

文章目录 DHCP和FTP&#xff08;原理实操&#xff09;DHCP使用DHCP&#xff08;自动分配IP&#xff09;的好处分配方式租约过程第一次重新登录更新租约DHCP服务可分配的地址信息主要包括 DHCP安装和配置实验目的实验环境:网络环境:系统环境:具体操作实操注意一、将三台虚拟机网…

数据结构——排序(4):归并排序+计数排序

目录 一、归并排序 &#xff08;1&#xff09;思想 &#xff08;2&#xff09;过程图示 &#xff08;3&#xff09;代码实现 (4) 代码解释 &#xff08;5&#xff09;复杂度 二、非比较排序&#xff08;计数排序&#xff09; &#xff08;1&#xff09;操作步骤 &#x…

《新一代数据可视化分析工具应用指南》正式开放下载

2024年8月12日&#xff0c;由DataEase开源项目组编写的《新一代数据可视化分析工具应用指南》白皮书正式面向广大用户开放下载。 《新一代数据可视化分析工具应用指南》是DataEase开源项目组为了支持企业落地并推广BI工具、推进企业数据可视化建设而编著的指导手册。通过本白皮…

【生成式人工智能-十二-影像生成原理】

文字生成影像的原理 影像生成的应用影像 是怎么生成的图片生成图片&#xff1a;影像生成影像文字生成图片按照文字AT的方式生成NAT 文字生成视频 怎么评价影像生成的好坏引入CLIP模型文字生成图片的难点文字生成视频的难点解决办法减少attention数目分迭代生成 前段时间sora生成…

前端字体没有授权,字体版权检测(是否为方正字体)

1.截图系统中的首页和登录页面&#xff0c;主要是有字体的地方 2.在线字体版权检测地址&#xff1a;字体版权自动检测-求字体网 3.上传照片&#xff0c;开始对图片进行检测&#xff0c;每个账号有三次免费次数 4.检测完&#xff0c;直接查看检测报告即可&#xff0c; 报告中…

[Spring] Spring事务与事务的传播

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

借助 Aspose.Words,在 Word 文档中创建表格

Word 文档中的表格是一种强大的工具&#xff0c;可用于以清晰、结构化的格式组织和呈现数据。表格由行和列组成&#xff0c;行和列相交形成可包含文本、数字、图像或其他元素的单元格。在本文中&#xff0c;我们将学习如何使用 C# 以编程方式在 Word 文档中创建表格。本文通过代…

虚幻5|高级运动实现基础的翻滚Roll 基础篇

一&#xff0c;调整项目设置——输入 1.我设置了翻滚是同时按W&#xff0b;Shift按键&#xff0c;如果你有更好的按键安排&#xff0c;评论区留言 二&#xff0c;打开角色蓝图&#xff0c;打开图表—基础移动&#xff08;你的放图表就行了&#xff0c;我这里是安排了很多排版的…

LDRA Testbed(TBrun)软件单元测试_实例讲解(局部静态变量)

系列文章目录 LDRA Testbed软件静态分析_操作指南 LDRA Testbed软件静态分析_自动提取静态分析数据生成文档 LDRA Testbed软件静态分析_Jenkins持续集成&#xff08;自动静态分析并用邮件自动发送分析结果&#xff09; LDRA Testbed软件静态分析_软件质量度量 LDRA Testbed软件…

使用Hugging Face构建大型语言模型应用

在本文中&#xff0c;我们将介绍如何使用Hugging Face的大型语言模型&#xff08;LLM&#xff09;构建一些常见的应用&#xff0c;包括摘要&#xff08;Summarization&#xff09;、情感分析&#xff08;Sentiment analysis&#xff09;、翻译&#xff08;Translation&#xff…

初步融合snowboy+pyttsx3+espeak+sherpa-ncnn的python代码

在前文《将Snowboy语音唤醒的“叮”一声改成自定义语言》中&#xff0c;我已经实现唤醒snowboy后&#xff0c;树莓派会说一句自定义文本。今天&#xff0c;会在此基础上增加ASR的应用&#xff08;基于sherpa-ncnn&#xff09;。 首先&#xff0c;编写一个asr.py的程序&#xf…

手撕快排——三种实现方法(附动图及源码)

&#x1f916;&#x1f4bb;&#x1f468;‍&#x1f4bb;&#x1f469;‍&#x1f4bb;&#x1f31f;&#x1f680; &#x1f916;&#x1f31f; 欢迎降临张有志的未来科技实验室&#x1f916;&#x1f31f; 专栏&#xff1a;数据结构 &#x1f468;‍&#x1f4bb;&…

【C++】STL——list

前言 本篇博客我们接着来理解一个STL库里的list链表的结构&#xff0c;根据前面数据结构的铺垫&#xff0c;理解这个结构相对比较容易。我们来一起看看吧 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;C 若有问题 评论区见&#x1f4dd; &#x1f38…

中国与中南半岛国家多国语言系统开发i18n配置老挝、柬埔寨语言配置

前言 当下中国与中南半岛国家经济合作密切&#xff0c;同时也需要软件系统&#xff0c;多国使用系统需要实现多语言&#xff0c;我们团队最近也接到一个中、老、柬三国的业务软件&#xff0c;需要将软件做成三个国家语言。然后我们网上收i18n的老、柬的语言包命名&#xff0c;…

计算机毕业设计 美妆神域网站 美妆商城系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

j2:基于pytorch的resnet实验:鸟类分类

基于pytorch的resnet实验&#xff1a;鸟类分类 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 Ⅰ Ⅰ Ⅰ Introduction&#xff1a; 本文为机器学习使用resnet实现鸟类图片分类的实验&#xff0c;素材来自网…