107 C++ STL 容器分类,array,vector详解

STL 的组成部分是个重要的部分,先回忆一下

容器,迭代器,算法(函数),分配器(分配内存),适配器,仿函数

一 容器的分类.

vector , list,map

容器是保存数据,用于管理一大堆数据。

分为三大类

第一类:顺序容器,sqquence containers.放进去在哪里,这个元素就排在哪里,例如,array, vector,deque,list,forward_list

第二类:关联容器 associative containers ,一般都是键值对.特别适合做查找。

关联容器你只能控制插入的数据,不能控制插入的位置。

set, map, multiset,multimap,hash_set,hash_map

第三类: 无序容器 unordered containers C++11推出来的。

元素的位置不重要,重要的是这个元素是否在这个集合里面。

无序容器实际上也属于一种关联容器。

无序容器里面的元素可能随着 新的元素的增加让原来元素的位置发生变化,这是无序容器内部 的算法决定的。

unordered  set/ multiset

unordered  map/ multimap

二 容器的说明和应用事项例

array: 是一个顺序容器,其实是一个数组,大小是固定的,刚开始申请的大小是多少,就是多少,不能扩展。

#include <array>

std::array C++文档说明

< cpp‎ | container

在标头 <array> 定义

template<

    class T,
    std::size_t N

> struct array;
(C++11 起)

std::array 是封装固定大小数组的容器。

此容器是一个聚合类型,其语义等同于保有一个 C 风格数组 T[N] 作为其唯一非静态数据成员的结构体。不同于 C 风格数组,它不会自动退化成 T* 。它能作为聚合类型聚合初始化,只要有至多 N 个能转换成 T 的初始化器: std::array<int, 3> a = {1,2,3}; 。

该结构体结合了 C 风格数组的性能、可访问性与容器的优点,比如可获取大小、支持赋值、随机访问迭代器等。

std::array 满足容器 (Container) 和可逆容器 (ReversibleContainer) 的要求,除了默认构造的 array 是非空的,以及进行交换的复杂度是线性,它满足连续容器 (ContiguousContainer) (C++17 起)的要求并部分满足序列容器 (SequenceContainer) 的要求。

当其长度为零时 arrayN == 0 )有特殊情况。此时, array.begin() == array.end() ,并拥有某个唯一值。在零长 array 上调用 front() 或 back() 是未定义的。

亦可将 array 当做拥有 N 个同类型元素的元组。

迭代器非法化

按照规则,指向 array 的迭代器在 array 的生存期间决不非法化。然而要注意,在 swap 时,迭代器将继续指向同一 array 的元素,并将改变元素的值。

测试验证:

#include <array>//STL array
void main() {array<string, 5> arr = {"nihao","ilovelovelovelovelovelovelovelove","wang"};cout << arr.size() << endl;//5cout << arr.max_size()<<endl;//5for (int i = 0; i < arr.size(); ++i) {cout << &arr[i] << endl;//将arr 数组中的每一个地址打印出来const char *p = arr[i].c_str();//将arr中的指向的string转化成 c风格的字符串cout << p << endl;//打印这些字符串printf(" p = %p\n",p);//将这些字符串的地址打印出来}
}

5
5
012FFAFC
nihaop = 012FFB00
012FFB18
ilovelovelovelovelovelovelovelovep = 017677E0
012FFB34
wangp = 012FFB38
012FFB50p = 012FFB54
012FFB6Cp = 012FFB70

这里涉及到string 在布局问题,可以查看

102 C++ string内存模型分析-CSDN博客

vector 详解

从下图我们就能知道,

1.vector 是顺序存储的,从vector的末尾加资源或者删除资源都很快。 push_back();

2.往中间插入元素可能导致很多后续元素都要执行重新构造,析构,效率会非常的低

3.查找速度不会快.

4.vector容器内存也是挨着的。

5.vector 是可变大小的容器。

6.从4和5可以推断出:当存储多个Teacher的时候,会有问题发生。

当第一次存储一个Teacher的时候,vector只会开出一个容纳 一个 Teacher size的空间。

当第二次存储另一个Teacher的时候,vector为了保证内存连续,则会重新开辟一个可以容纳2个Teacher的空间大小,然后将Teacher1 copy构造过来。然后加上一个Teacher2.

当第三次存储第三个Teacher的时候,vector为了保证内存连续,则会重新开辟一个可以容纳3个Teacher的空间大小,然后将Teacher1 和 Teacher2 copy构造过来。然后加上一个Teacher3

7.怎么改良这个呢?

vector虽然好用,但是从上述能看出来,这玩意是因为每次都搞一个空间,导致Teacher 类的,构造函数,copy 构造函数,析构函数,会被频繁的调用,这很影响效率。实际上,由于代码是我们自己写的,在某些情况下,我们很容易知道,大概这个vector会容纳多少个Teacher,因此可以在开始的时候,通过 vector.

问题发生时的代码

void main() {vector<Teacher6> vec;for (int i = 0; i < 5; ++i) {cout << "start i = " << i << endl;vec.push_back(Teacher6(i));//start i = 0//	Teacher6 gouzao mage = 0 this = 0093F6D8  //先构造 Teacher6(0)//	Teacher6 copy gouzao  this = 00E02680  obj = 0093F6D8//然后将Teacher6(i)通过copy 构造 copy 给 vector中//	Teacher6 xigou  this = 0093F6D8 //然后将Teacher6(0) 析构//	start i = 1//	Teacher6 gouzao mage = 1 this = 0093F6D8//先构造 Teacher6(1)//	Teacher6 copy gouzao  this = 00E00D84  obj = 0093F6D8//然后将Teacher6(i)通过copy 构造 copy 给 vecto//	Teacher6 copy gouzao  this = 00E00D80  obj = 00E02680 //将vector 中的第一个元素通过 copy 构造到新的位置上//	Teacher6 xigou  this = 00E02680 //将之前的vector中的元素析构//	Teacher6 xigou  this = 0093F6D8 //把 Teacher6(1)析构了//	start i = 2//	Teacher6 gouzao mage = 2 this = 0093F6D8//	Teacher6 copy gouzao  this = 00E00B20  obj = 0093F6D8//	Teacher6 copy gouzao  this = 00E00B18  obj = 00E00D80//	Teacher6 copy gouzao  this = 00E00B1C  obj = 00E00D84//	Teacher6 xigou  this = 00E00D80//	Teacher6 xigou  this = 00E00D84//	Teacher6 xigou  this = 0093F6D8//	start i = 3//	Teacher6 gouzao mage = 3 this = 0093F6D8//	Teacher6 copy gouzao  this = 00DF6E24  obj = 0093F6D8//	Teacher6 copy gouzao  this = 00DF6E18  obj = 00E00B18//	Teacher6 copy gouzao  this = 00DF6E1C  obj = 00E00B1C//	Teacher6 copy gouzao  this = 00DF6E20  obj = 00E00B20//	Teacher6 xigou  this = 00E00B18//	Teacher6 xigou  this = 00E00B1C//	Teacher6 xigou  this = 00E00B20//	Teacher6 xigou  this = 0093F6D8//	start i = 4//	Teacher6 gouzao mage = 4 this = 0093F6D8//	Teacher6 copy gouzao  this = 00E02B40  obj = 0093F6D8//	Teacher6 copy gouzao  this = 00E02B30  obj = 00DF6E18//	Teacher6 copy gouzao  this = 00E02B34  obj = 00DF6E1C//	Teacher6 copy gouzao  this = 00E02B38  obj = 00DF6E20//	Teacher6 copy gouzao  this = 00E02B3C  obj = 00DF6E24//	Teacher6 xigou  this = 00DF6E18//	Teacher6 xigou  this = 00DF6E1C//	Teacher6 xigou  this = 00DF6E20//	Teacher6 xigou  this = 00DF6E24//	Teacher6 xigou  this = 0093F6D8//	Teacher6 xigou  this = 00E02B30//	Teacher6 xigou  this = 00E02B34//	Teacher6 xigou  this = 00E02B38//	Teacher6 xigou  this = 00E02B3C//	Teacher6 xigou  this = 00E02B40}
}

改动后的代码:

void main() {vector<Teacher6> vec;cout << vec.capacity() << endl;cout << vec.size() << endl;vec.reserve(10);cout << vec.capacity() << endl;cout << vec.size() << endl;for (int i = 0; i < 5; ++i) {cout << "start i = " << i << endl;vec.push_back(Teacher6(i));}//  0//	0//	10//  0//  start i = 0//	Teacher6 gouzao mage = 0 this = 00D9F8D0//	Teacher6 copy gouzao  this = 014B6E18  obj = 00D9F8D0//	Teacher6 xigou  this = 00D9F8D0//	start i = 1//	Teacher6 gouzao mage = 1 this = 00D9F8D0//	Teacher6 copy gouzao  this = 014B6E1C  obj = 00D9F8D0//	Teacher6 xigou  this = 00D9F8D0//	start i = 2//	Teacher6 gouzao mage = 2 this = 00D9F8D0//	Teacher6 copy gouzao  this = 014B6E20  obj = 00D9F8D0//	Teacher6 xigou  this = 00D9F8D0//	start i = 3//	Teacher6 gouzao mage = 3 this = 00D9F8D0//	Teacher6 copy gouzao  this = 014B6E24  obj = 00D9F8D0//	Teacher6 xigou  this = 00D9F8D0//	start i = 4//	Teacher6 gouzao mage = 4 this = 00D9F8D0//	Teacher6 copy gouzao  this = 014B6E28  obj = 00D9F8D0//	Teacher6 xigou  this = 00D9F8D0//	Teacher6 xigou  this = 014B6E18//	Teacher6 xigou  this = 014B6E1C//	Teacher6 xigou  this = 014B6E20//	Teacher6 xigou  this = 014B6E24//	Teacher6 xigou  this = 014B6E28
}

特别注意的是:vector 的不恰当使用,会造成效率很低,使用时要非常小心

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

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

相关文章

Narrative Visualization: Telling Stories with Data

作者&#xff1a;Edward Segel、Jeffrey Heer 发表&#xff1a;TVCG&#xff0c; 机构&#xff1a;UW Interactive Data Lab 【原斯坦福可视化组】 1.概述 静态可视化&#xff1a;在一大串的文本描述中&#xff0c;可视化作为提供证据和细节的图表出现新兴可视化&#xff1a…

元数据驱动的思想

元数据驱动的思想 元数据驱动的思想应该不会陌生&#xff0c;但元数据驱动的实践应该会非常陌生。 因为元数据驱动架构是为了解决高频个性化的复杂业务而诞生的&#xff0c;而这种业务场景只存在2B领域。 有关元数据驱动的架构思想&#xff0c;在这里暂先简单抛几个点。&#…

精雕细琢的文档体验:Spring Boot 与 Knife4j 完美交汇

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 精雕细琢的文档体验&#xff1a;Spring Boot 与 Knife4j 完美交汇 前言Knife4j 与 Swagger 的区别1. 特性与优劣势对比&#xff1a;Knife4j&#xff1a;Swagger&#xff1a; 2. 选择 Knife4j 的理由&a…

Nodejs基础6之HTTP模块的获取请求行和请求头、获取请求体、获取请求路径和查询字符串、http请求练习、设置HTTP响应报文、http响应练习

Nodejs基础 HTTP模块获取请求行和请求头获取请求体获取请求路径和查询字符串方式一方式二 http请求练习设置HTTP响应报文状态码响应状态描述响应头响应体 HTTP响应练习 HTTP模块 含义语法重点掌握请求方法request.method*请求版本request.httpVersion请求路径request.url*URL …

Mac利用brew安装mysql并设置初始密码

前言 之前一直是在windows上开发后段程序&#xff0c;所以只在windows上装mysql。(我记得linux只需要适应yum之类的命令即可) 另外, linux的移步 linux安装mysql (详细步骤,初次初始化,sql小例子,可视化操作客户端推荐) 好家伙&#xff0c;我佛了&#xff0c;写完当天网上发…

机器学习聚类算法

聚类算法是一种无监督学习方法&#xff0c;用于将数据集中的样本划分为多个簇&#xff0c;使得同一簇内的样本相似度较高&#xff0c;而不同簇之间的样本相似度较低。在数据分析中&#xff0c;聚类算法可以帮助我们发现数据的内在结构和规律&#xff0c;从而为进一步的数据分析…

深度学习缝模块怎么描述创新点?(附写作模板+涨点论文)

深度学习缝了别的模块怎么描述创新点、怎么讲故事写成一篇优质论文&#xff1f; 简单框架&#xff1a;描述自己这个领域&#xff0c;该领域出现了什么问题&#xff0c;你用了什么方法解决&#xff0c;你的方法有了多大的性能提升。 其中&#xff0c;重点讲清楚这两点&#xf…

QtAV学习:(一)Windows下编译QtAV

QtAV 主页&#xff1a; QtAV by wang-bin 作者的编译构建说明文档&#xff1a; Build QtAV wang-bin/QtAV Wiki GitHub 我的编译环境&#xff1a; 编译环境&#xff1a;win10/msvc2015/Qt5.6.3 第一步&#xff1a;GitHub拉取代码,执行子模块初始化 地址&#xff1a; …

2024-01-07-AI 大模型全栈工程师 - 做自己的产品经理

摘要 2024-01-07 周日 杭州 阴 本节内容: a. 如何做好独立开发设计&#xff0c;实现财富自由&#xff1b; 课程内容 1. 独立开发者 英文 indie hacker&#xff0c;是指独立开发软件产品的人&#xff1b;一人承担一个项目产品的所有工作&#xff1b; 2. 创业机会 云计算设…

C++ 内存模型

C内存模型 - MrYun - 博客园 (cnblogs.com) 内存区域 C内存分为5个区域&#xff1a;堆 heap &#xff1a; 由new分配的内存块&#xff0c;其释放编译器不去管&#xff0c;由我们程序自己控制&#xff08;一个new对应一个delete&#xff09;。如果程序员没有释放掉&#xff0c…

abap - 发送邮件,邮件正文带表格和excel附件

发送内容 的数据获取&#xff1a; 正文部分使用cl_document_bcs>create_document静态方法实现 传入参数为html内表结构 CLEAR lo_document .lo_document cl_document_bcs>create_document(i_type HTMi_text lt_htmli_length conlengthsi_subject lv_subje…

【漏洞复现】EPON上行A8-C政企网关信息泄露漏洞

Nx01 产品简介 EPON上行A8-C政企网关是一款终端产品&#xff0c;提供企业网络解决方案。 Nx02 漏洞描述 EPON上行A8-C政企网关敏感信息泄露漏洞&#xff0c;攻击者通过敏感信息泄露获取管理员密码。 Nx03 产品主页 fofa-query: "ZXECS" && title"Web…

【机器学习】机器学习简单入门

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;matplotlib &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

<.Net>使用visual Studio 2022在VB.net中新添自定义画图函数(优化版)

前言 这是基于我之前的一篇博文&#xff1a; 使用visual Studio 2019在VB.net中新添自定义画图函数 在此基础上&#xff0c;我优化了一下&#xff0c;改进了UI&#xff0c;添加了示例功能&#xff0c;即以画圆函数为基础&#xff0c;添加了走马灯功能。 先看一下最终效果&#…

Google Chrome Close AutoUpdate

DOMException: play() failed because the user didn‘t interact with the document first.-CSDN博客 html5 audio video-CSDN博客 Google Chrome Close AutoUpdate 关闭google浏览器自动更新 1&#xff1a;检查是否已安装google浏览器&#xff0c;并卸载&#xff1a; 2&…

router路由跳转的两种模板

<router-link><router-link/> <router-view><router-view/> link &#xff1a;链接&#xff0c;联系 view&#xff1a;指看见展现在人们面前的、可以稳定地进行详细审视的事物 将语境拉回到router里&#xff0c;抽象概括一下 router-link就是一个…

55. 右旋字符串(卡码网KamaCoder)

文章目录 55. 右旋字符串题目描述暴力优化&#xff1a;不能申请额外空间&#xff0c;只能在本串上操作思路代码 55. 右旋字符串 题目描述 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&…

Spark SQL调优实战

1、新添参数说明 // Driver和Executor内存和CPU资源相关配置 --是否开启executor动态分配&#xff0c;开启时spark.executor.instances不生效 spark.dynamicAllocation.enabledfalse --配置Driver内存 spark.dirver.memory5g --driver最大结果大小&#xff0c;设置为0代…

SQLserver2008 r2 下载安装配置、使用、新建登录用户及通过Navicat远程连接

目录 一、下载 二、安装配置 1.安装 2.许可条款 3.安装程序支持文件 4.功能选择 5.实例配置 6.服务器配置 7.数据库引擎配置 8.Reporting Services 配置 9.安装进度 ​编辑 10.完成 三、使用 四、新建登录用户 1.新建登录名 2.常规 3.服务器角色 4. 用户映…

基于CNN+LSTM深度学习网络的时间序列预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 卷积神经网络&#xff08;CNN&#xff09; 4.2 长短时记忆网络&#xff08;LSTM&#xff09; 4.3 CNNLSTM网络结构 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MA…