C++ vector

ops/2024/11/8 20:45:05/

1.vector的介绍

vector的文档介绍

2.vector的使用

vector学习时一定要学会查看文档:vector文档介绍,vector在实际中非常的重要。

在实际中 我们熟悉常见的接口就可以,下面列出了哪些接口是要重点掌握的。

2.1vector的定义

2.2vector iterator(迭代器)的使用

迭代器是一种封装的体现,屏蔽了底层的实现细节,提供了统一的类似访问容器的方式,不需要关心容器底层结构和实现细节,底层类似于指针但实际上不是指针,不是所有的容器的迭代器都是原生指针,容器的底层有的是数组有的是链表,物理结构上有的不连续,指针解引用也不是真实值。

2.3vector的空间增长问题

capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2 倍增长的。这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是 根据具体的需求定义的。

vs是PJ版本STL,g++是SGI版本STL。

reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代 价缺陷问题。

resize在开空间的同时还会进行初始化,影响size。

2.4vector的增删查改

ostream& operator<<(ostream& out,const string& s);流插入:读取string字符串写到输出流out流里

istream& operator>>(const istream& in,string& s);流提取:读取in输入流写到string里

cin 和 scanf 默认“ ”和“\n”是分隔符 -》C语言的getc(),C++的get()不涉及分割字符,一个一个的字符读,getline()默认遇到“\n”停止,也可以自己设置终止符。

 2.5迭代器的失效问题(重点)

迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对 指针进行了封装,比如:vector的迭代器就是原生态指针T* 。

因此迭代器失效,实际就是迭代器 底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即 如果继续使用已经失效的迭代器,程序可能会崩溃)。

对于vector可能会导致其迭代器失效的操作有:

1. 会引起其底层空间改变的操作,都有可能是迭代器失效,比如:resize、reserve、insert、 assign、push_back等。

2. 指定位置元素的删除操作--erase

erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理 论上讲迭代器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end 的位置,而end位置是没有元素的,那么pos就失效了。因此删除vector中任意位置上元素 时,vs就认为该位置迭代器失效了。

3. 注意:Linux下,g++编译器对迭代器失效的检测并不是非常严格,处理也没有vs下极端。

从上述三个例子中可以看到:SGI STL中,迭代器失效后,代码并不一定会崩溃,但是运行 结果肯定不对,如果it不在begin和end范围内,肯定会崩溃的。

4. 与vector类似,string在插入+扩容操作+erase之后,迭代器也会失效

迭代器失效解决办法:在使用前,对迭代器重新赋值即可!!!

3.vector在OJ中的使用

3.1只出现一次的数字

3.2杨辉三角

总结:通过上面的练习我们发现vector常用的接口更多是插入和遍历。

遍历更喜欢用数组 operator[i]的形式访问,因为这样便捷。课下自己实现一遍上面课堂讲解的OJ练习,以此增强学习vector的使用。

4.vector的深度剖析和模拟实现

4.1vector的模拟实现

vector的模拟实现

4.2使用memcpy的拷贝问题

1. memcpy是内存的二进制格式拷贝,将一段内存空间中内容原封不动的拷贝到另外一段内存 空间中

2. 如果拷贝的是内置类型的元素,memcpy既高效又不会出错,但如果拷贝的是自定义类型 元素,并且自定义类型元素中涉及到资源管理时,就会出错,因为memcpy的拷贝实际是浅 拷贝。

结论:如果对象中涉及到资源管理时,千万不能使用memcpy进行对象之间的拷贝,因为 memcpy是浅拷贝,否则可能会引起内存泄漏甚至程序崩溃。

5.动态二维数组

vv中元素填充完成之后,如下图所示:

使用标准库中vector构建动态二维数组时与上图实际是一致的。


http://www.ppmy.cn/ops/132026.html

相关文章

C++入门基础知识140—【关于C++ 类构造函数 析构函数】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C 类构造函数 & 析构函数的相关内容…

基于百度飞桨paddle的paddlepaddle2.4.2等系列项目的运行

PPASR 必看&#xff01;&#xff01;&#xff01; PaddleSpeech develop --> PaddlePaddle 2.5.0/2.5.1 PaddleSpeech < 1.4.1 --> PaddlePaddle < 2.4.2 1.创建虚拟环境 conda create --name test python3.10 2.激活环境&#xff0c;安装ppasr的paddlepaddl…

基于OpenCV的相机捕捉视频进行人脸检测--米尔NXP i.MX93开发板

本篇测评由优秀测评者“eefocus_3914144”提供。 本文将介绍基于米尔电子MYD-LMX93开发板&#xff08;米尔基于NXP i.MX93开发板&#xff09;的基于OpenCV的人脸检测方案测试。 OpenCV提供了一个非常简单的接口&#xff0c;用于相机捕捉一个视频(我用的电脑内置摄像头) 1、安…

【WebRTC】视频采集模块流程的简单分析

目录 1.从摄像头获取视频帧&#xff08;CaptureInputPin::Receive()&#xff09;2.处理摄像头获取的帧&#xff08;CaptureSinkFilter::ProcessCaptureFrame())3.处理Windows层帧信息并发送到帧处理器&#xff08;VideoCaptureImpl::IncomingFrame())4.帧处理器&#xff08;Vid…

【系统架构设计师】2021年真题论文: 论面向方面的编程技术及其应用(AOP)(包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2021年 试题1)解题思路面向方面的编程(AOP)技术概念和原理AOP的核心机制AOP 在软件系统开发中的应用场景AOP 应用案例分析论文素材参考真题题目(2021年 试题1) 面向过程编程是一种自顶向下的编程方…

2024MoonBit全球编程创新挑战赛参赛作品“飞翔的小鸟”技术开发指南

本文转载自 CSDN&#xff1a;https://blog.csdn.net/m0_61243965/article/details/143510089作者&#xff1a;言程序plus 实战开发基于moonbit和wasm4的飞翔的小鸟游戏 游戏中&#xff0c;玩家需要通过上下左右按键控制Bird&#xff0c;在不断移动的障碍pipe之间穿梭&#xf…

网络技术---网络通信概述

网络通信概述 网络通信概述一、网络通信的层次二、OSI七层网络模型三、TCP/IP五层模型1. 物理层1.1 物理层作用1.2 物理层概述1.3 信号调制1.4 信道复用技术 2. 数据链路层2.1 数据链路层作用2.2 点对点数据链路层三个基本问题2.3 滑动窗口协议2.4 以太网 3. 网络层3.1 概述3.2…

【Python】anancode怎么快速找到site-packages 的路径位置

在Python环境中&#xff0c;site_packages是一个特殊的目录&#xff0c;用于存放第三方库文件&#xff0c;我们所有运行的python包&#xff0c;就在这个文件夹底下。 要查找site-packages的路径&#xff0c;你可以使用以下几种方法&#xff1a; 方法1&#xff1a;使用Python解…