当前位置: 首页 > news >正文

【STL vector的全面指南】基础操作与底层实现<1>

前面,我们写过了string的使用与底层,今天我们主要来讲解一下vector。vector是指顺序表这一数据结构。相比而言,它会比string简单很多。

一、构造函数

首先是构造函数,第一个构造支持我们去传一个空间配置器,当我们如果认为,如果我们觉得库中的内存池写得不满意,我们可以自行书写,也就是给了我们造轮子的空间。

第二个构造是使用n个val进行构造:

第三个是使用迭代器区间构造:

第四个是拷贝构造。这里可以看到vector要比string简洁很多。

二、vecor遍历

(一)iterator

1、operator[]

2.begin()

(二)capacity

三、Modifier

(一)push_back()尾插/reserve()扩容

这里的push_back()、pop_back()均是删除一个数据

(二)shrink_to_fit()

缩容操作,与string相差不大

(三)insert() 

insert()效率较低,但可以插入几个数据,当有两个参数时,前面参数为插入位置,后面为插入数据

(四)erase()

删除数据:第一个为删除一个数据;第二个方式为删除一个vector区间

(五)find()

vector中没有专用的find()方法,不过使用库中的find()就已经够用了,如果未查找到val,则返回last

(六)assign()

Assigns new contents to the vector, replacing its current contents, and modifying its size accordingly.分配新内容至vector中,将当前的内容重新分配并修改其当前vector大小。

———————————————————————————————————————————

四、vector<string>

我们知道string是char的数组,vector可以存放任意类型,那么vector<char> v可以作为string s吗?答案是不可以的,vector只管存储对应类型的数据,真正的差异在于其没有‘\0’的标识,没有办法兼容C语言,在接口的设计上面也会有很大差异;

vector只有插入一个数据push_back,相比string之下,它没有append、operator+=;它在find查找操作中,也无法查找一个子串,只使用算法库中的find。

(一)vector也是可以存储string类型的变量

我们之前写对象,要写一个有名对象或至少写一个匿名对象,再进行传值。单参数构造函数的隐式类型转换,看起来是没什么意义的,但在实践角度他很有用,此处的&val会走隐式类型转换,构造出一个string临时对象。类型转换之间也会产生临时对象。

下图中,我们本身有一个string类型的对象,传给push_back()后,const char* val会构造一个string,本质上是走隐式类型转换,生成了一个临时对象。 

注意注意:由于范围for的底层是iterator,类似于指针,将临时对象赋值给给e,*iterator就是取数据,也就是我们的string对象,又会进行一次拷贝构造,对于自定义类型的变量(像int),是否加上&引用差别不大,而下面的情况代价就会很大,所以这些地方就要加上引用。

关于(5)move:他是C++11下的右值引用,主要用来提效(我们暂时不涉及暂时) 

关于(6)关于initializer_list:这里是一个构造,主要使我们使用vector变得更加便利。是C++11单独增加的一个类,

这里花括号传值给Initializer_list:

底层类似于根据其类型构造一个数组,并为其配备两个指针:begin、end,根据调试中的原始视图可以观察到数组的开始到结束为止。

首先要包含到<initializer_list>头文件    

(二)emplace=insert,emplace_back=push_back

具体体现在:

其中,区别具体体现在当构造自定义类型时的变量为多参数时,用emplace_back(),直接传递构造A的多参数会一定程度的提高构造及插入数据的效率。

另一方面,A类型中包含着多参数,仅适用库中流插入/提取,输出对他解引用的内容是不现实的,所以我们可以对其进行重载,或者需要使用  . / -> 来访问A类型的内容。

应用方法:

(1)由于迭代器可以看为与指针很像,其类型可以看做A*,解引用时,可以使用 . 来访问其内容。

(2)将A看做结构体,即使用 -> 访问内容。(这个是经常使用的)

其中,C++17中的结构化绑定:将成员依次赋值给  [x,y]  ,此时是存在拷贝构造的,后者加上引用,无拷贝构造,大大提高了效率。

未完待续。。。

http://www.dtcms.com/a/390912.html

相关文章:

  • 微服务-基础知识(CAP、BASE)
  • 存储卷清理策略在vps环境磁盘空间维护的操作指南
  • Day46 ARM硬件体系 从计算机架构、处理器类型、指令集到内核寄存器与SoC总线结构
  • 【MySQL】从视图到用户和权限管理
  • 栈与队列:核心差异与应用场景
  • 【Hadoop】ZooKeeper:分布式系统的协调核心与一致性保障
  • AWS 全球机房延迟对比 区域选型经验分享
  • 免费插件分享 |Scene Switcher Pro
  • Vue前端开发工具有哪些?常用Vue开发工具推荐、Vue前端开发工具对比与最佳实践分享
  • 信道管理模块实现
  • Java 网络原理(一)--- 自定义协议,UDP协议和TCP协议
  • 键盘失灵 键盘不好使问题解决(更新到 Windows 11后 )
  • 远程控制操作中,如何开启游戏键盘及3D鼠标?移动端设置教程分享
  • C 语言宏函数进阶:逗号表达式与 GNU 拓展的妙用
  • 币安加密货币API接口文档
  • Ubuntu20.04仿真 | iris无人机添加mid360激光雷达可直接使用文件
  • 17.ImGui-Hook消息循环
  • 《Skinned Mesh Renderer与LOD系统蒙皮变形异常全解析》
  • 免费插件分享 |Pro Scene Manager
  • Elasticsearch 的 ES|QL 编辑器体验 vs. OpenSearch 的 PPL 事件分析器
  • Unity核心概念⑪:光
  • C 语言运算符优先级(超详细)
  • Ingress使用示例
  • HarmonyOS开源项目分享:识笺——高效学习的卡片应用
  • 揭秘提示词攻击:AI时代的安全新战场
  • vscode安装go插件问题
  • 创作一个简单的编程语言3 加上VLLM后端
  • C语言入门指南:内存操作函数详解
  • React 列表渲染 列表排序 条件渲染 数据渲染 响应式处理
  • 从安卓手机切换到iPhone:好处、缺点及4种方法