c++--vector

1.定义vector

vector的定义分为四种

(1)vector()   ——————无参构造

(2)vector(size_t n,const value_type& val = value_type())   ——————构造并初始化n个val

(3)vector(const vector& v1) ———————拷贝构造

(4)vector(inputiterator first,inputiterator last) ————使用迭代器进行初始化

代码模拟实现:

namespace c_simplystudy:
{
template<class T>
class vector
{
public:vector(){_start = nullptr;_finish = nullptr;_endOfStorage = nullptr;}vector(int n, const T& value = T()):_start(new T[n]),_finish(_start+n),_endOfStorage(_finish){for (int i = 0; i < n; i++){*(_start + i) = value;}}
template<class InputIterator>vector(const vector<T>& v):_start(nullptr),_finish(nullptr), _endOfStorage(nullptr){reverse(v.capacity());iterator it = begin();const iterator last = cbegin();while (it != last){*it++ = *last++;}_finish = it;}vector(InputIterator first, InputIterator last){while (first != last){push_back(*first);first++;}}
private:
iterator _start; // 指向数据块的开始
iterator _finish; // 指向有效数据的尾
iterator _endOfStorage; // 指向存储容量的尾
};
}

2.vector迭代器的使用与空间增长控制

迭代器:

 (1)begin()————获取第一个数据位置的iterator/const_iterator

 (2)end()————获取最后一个数据的下 一个位置的iterator/const_iterator

 (3)rbegin()————获取最后一个数据位置的reverse_iterator

 (4)rend()————获取第一个数据前一个位置的reverse_iterator

空间增长:
 (1)size()————获取数据个数

 (2)capacity()————获取容器容量

不同的编译器下,容器“满了”时,扩容的规则不同,在VS下是按1.5倍增长的,g++则是按2倍增长

 (3)empty()————判空

 (4)reserve()————改变capacity

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

 (5)resize(n,val)————改变size(n为改变后的size,val为用于初始化的值)

如果n<size,则size=n,不进行初始化;如果n>capacity,则扩容至n,并且将未初始化的数据初始化为val

3.vector增删查改

 (1)push_back()————尾插

 (2) pop_back()————尾删

 (3)find()————查找

如果存在则返回位置

 (4)insert()————插入

 (5)erase()————删除

 (6)swap()————交换两个vector

 (7)operate[]————下标索引

4.vector迭代器失效

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

迭代器失效有两种情况:

(1)当 it 用vector.begin()初始化后,如果对vector进行增或者可能会导致其扩容的操作,则vector在扩容时会释放掉旧空间,begin()会指向新空间,而这里的 it 却仍指向被释放掉的旧空间,此时用 it 进行迭代器操作则会发生迭代器失效

int main()
{vector<int> v{1,2,3,4,5};auto it=v.begin();v.reserve(100);     //通过扩容使迭代器失效while(it != v.end()){cout << *it << " ";++it;}            //vs下会直接崩溃return 0;
}

(2)继续将 it 用vector中的迭代器进行初始化,如果使用erase将 it 指向的迭代器删除掉,则 it 指向的迭代器会失效,如果仍然对 it 进行解引用,则会发生报错;erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理 论上讲迭代器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end 的位置,而end位置是没有元素的,那么pos就失效了。因此删除vector中任意位置上元素 时,vs就认为该位置迭代器失效了

#include <vector>
#include <algorithm>
int main()
{vector<int> v{1,2,3,4,5};vector<int>::iterator it = find(v.begin(), v.end(), 3);v.erase(it);while(it != v.end()){cout << *it << " ";++it;}          //因为空间还是原来的空间,后序元素往前搬移了,it的位置还是有效的//erase删除的迭代器如果是最后一个元素,删除之后it已经超过end//                         此时迭代器是无效的,++it导致程序崩溃return 0;
}

(此问题在string中也会出现,而且如果在linux环境下运行程序,由于g++编译器对于迭代器失效的检测并不严格,所以当迭代器失效后,对失效后的迭代器进行引用并不会报错,但是运行结果已经不同)

迭代器失效解决方法在使用前,对迭代器重新赋值

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

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

相关文章

宇树科技纯技能要求总结

一、嵌入式开发与硬件设计 核心技能 嵌入式开发&#xff1a; 精通C/C&#xff0c;熟悉STM32、ARM开发熟悉Linux BSP开发及驱动框架&#xff08;SPI/UART/USB/FLASH/Camera/GPS/LCD&#xff09;掌握主流平台&#xff08;英伟达、全志、瑞芯微等&#xff09; 硬件设计&#xff1a…

「Unity3D」UGUI运行时设置元素的锚点Anchor,维持元素Rect的显示不变,即待在原处

在编辑器中&#xff0c;通过设置Raw edit mode&#xff0c;可以切换两种&#xff0c;元素锚点的改变模式&#xff1a; 一种是锚点单独改变&#xff0c;即&#xff1a;不开启原始模式&#xff0c;保持原样&#xff0c;改变anchoredPosition与sizeDelta。一种是锚点联动显示&…

使用 Google Firebase 控制台和 ESP8266 NodeMCU 的物联网控制 LED

使用 Google Firebase 控制台控制 LED ESP8266 您是否想过从世界任何地方控制任何外围设备?是的,IoT(物联网)使从任何地方控制任何设备成为可能,并且有许多 IoT 硬件和云平台可用于实现这一目标。在前面的教程中,我们已经介绍了许多 IoT 应用程序。今天,我们将使用 Goo…

【数据库】如何用索引优化查询性能

引言 在数据库查询中&#xff0c;索引是提升性能的关键工具。合理使用索引可以显著减少数据扫描量&#xff0c;加快查询速度。然而&#xff0c;索引的使用也需要谨慎&#xff0c;错误的索引策略可能导致性能下降甚至系统崩溃。本文将深入探讨如何通过索引优化查询性能&#xf…

LeetCode 392. 判断子序列 java题解

https://leetcode.cn/problems/is-subsequence/description/ 转化为最长公共子序列问题。求[lens][j]的公共子序列长度是否为lens。 class Solution {//s属于t,lens<lentpublic boolean isSubsequence(String s, String t) {int lenss.length(),lentt.length();if(s.length…

【Kubernetes】Kube Proxy 如何帮助 Pod 之间通信?Kube-Proxy 实践案例

kube-proxy 主要通过管理网络规则和流量转发来帮助 Pod 之间进行通信&#xff0c;具体方式如下&#xff1a; 1. 维护 Service 相关的网络规则 kube-proxy 监听 API Server&#xff0c;当 Service 或 Endpoints 发生变化时&#xff0c;动态更新网络规则。确保流量能正确地从 S…

平衡树的模拟实现

一.平衡树的介绍 平衡树是以二叉树结构为基础&#xff0c;同时引入了平衡因子进行了限制&#xff0c;以保证树的结点之间的高度差小于等于1&#xff0c;在插入删除结点时通过旋转的方法保持高度相对平衡&#xff0c;从而提高搜索等效率。 二.代码实现 1.平衡树结点 平衡树结…

JavaScript基础-获取元素

在Web开发中&#xff0c;使用JavaScript动态地访问和操作网页上的元素是一项基本技能。通过获取页面上的特定元素&#xff0c;我们可以对其进行各种操作&#xff0c;比如修改内容、样式或属性等。本文将详细介绍几种获取DOM元素的方法&#xff0c;并探讨它们的特点及适用场景。…

为什么要用(:deep、::v-deep、>>>)样式穿透

在 Vue.js 中&#xff0c;当你使用像 Element UI 这样的 UI 库时&#xff0c;它们的样式通常是全局的&#xff0c;即使你在组件中使用了 scoped 样式&#xff08;为什么要用scoped&#xff09;&#xff0c;仍然可能需要对这些全局样式进行修改。 为了实现这一点&#xff0c;样…

MySQL中的事务隔离级别有哪些

MySQL中的事务隔离级别 一、事务并发问题二、MySQL 事务隔离级别1. READ UNCOMMITTED&#xff08;读未提交&#xff09;2. READ COMMITTED&#xff08;读已提交&#xff09;3. REPEATABLE READ&#xff08;可重复读&#xff09;&#xff08;MySQL 默认级别&#xff09;4. SERIA…

Python----计算机视觉处理(Opencv:图像镜像旋转)

一、图像镜像旋转 图像的旋转是围绕一个特定点进行的&#xff0c;而图像的镜像旋转则是围绕坐标轴进行的。图像镜像旋转&#xff0c;也可 以叫做图像翻转&#xff0c;分为水平翻转、垂直翻转、水平垂直翻转三种。 通俗的理解为&#xff0c;当以图片的中垂线为x轴和y轴时&#x…

hibernate 自动生成数据库表和java类 字段顺序不一致 这导致添加数据库数据时 异常

hibernate 自动生成的数据库表和java类 字段顺序不一致 这导致该书写方式添加数据库数据时 异常 User user new User( null, username, email, phone, passwordEncoder.encode(password) ); return userRepository.save(user);Hibernate 默认不会保证数据库表字段的顺序与 Ja…

python|结构的模式匹配match|同步迭代

在 Python 中&#xff0c;模式匹配&#xff08;Pattern Matching&#xff09; 是一种强大的功能&#xff0c;用于根据数据的结构或内容进行匹配和处理。Python 3.10 引入了 match 语句&#xff0c;使得模式匹配更加直观和灵活。模式匹配可以用于处理复杂的数据结构&#xff0c;…

博客图床 VsCode + PigGo + 阿里云OSS

关键字 写博客&#xff0c;图床&#xff0c;VsCode&#xff0c;PigGo&#xff0c;阿里云OSS 背景环境 我想把我在本地写的markdown文档直接搬到CSDN上和博客园上&#xff0c;但是图片上传遇到了问题。我需要手动到不同平台上传文件&#xff0c;非常耗费时间和经历。 为了解决…

路由器安全研究:D-Link DIR-823G v1.02 B05 复现与利用思路

前言 D-Link DIR-823G v1.02 B05存在命令注入漏洞&#xff0c;攻击者可以通过POST的方式往 /HNAP1发送精心构造的请求&#xff0c;执行任意的操作系统命令。 漏洞分析 binwalk提取固件&#xff0c;成功获取到固件。 现在我们已经进入到应用里了&#xff0c;那么我们在进行分析…

c++ 类和对象 —— 下 【复习总结】

1. 深入构造函数 1.1 函数体赋值 前文我们提到&#xff0c;创建对象时&#xff0c;编译器会调用构造函数给成员变量赋值。但这并不能称为对对象中成员变量的初始化。因为初始化只能初始化一次&#xff0c;但构造函数体内可以多次赋值。构造函数体中语句只能称为赋初值 那么&…

【量化科普】Volatility,波动率

【量化科普】Volatility&#xff0c;波动率 &#x1f680;量化软件开通 &#x1f680;量化实战教程 在金融市场中&#xff0c;波动率&#xff08;Volatility&#xff09;是衡量资产价格变动幅度的一个重要指标。它反映了资产价格的稳定性和风险水平。高波动率意味着资产价格…

PCIe(Peripheral Component Interconnect Express)详解

一、PCIe的定义与核心特性 PCIe&#xff08;外设组件互连高速总线&#xff09;是一种 高速串行点对点通信协议&#xff0c;用于连接计算机内部的高性能外设。它取代了传统的PCI、PCI-X和AGP总线&#xff0c;凭借其高带宽、低延迟和可扩展性&#xff0c;成为现代计算机系统的核…

idea 编译打包nacos2.0.3源码,生成可执行jar 包常见问题

目录 问题1 问题2 问题3 问题4 简单记录一下nacos2.0.3&#xff0c;编译打包的步骤&#xff0c;首先下载源码&#xff0c;免积分下载&#xff1a; nacos源码&#xff1a; https://download.csdn.net/download/fyihdg/90461118 protoc 安装包 https://download.csdn.net…

通过 TTL 识别操作系统的原理详解

TTL 的工作原理 TTL&#xff08;Time to Live&#xff0c;生存时间&#xff09;是网络中用于控制数据包生命周期的一个关键参数。它通过限制数据包在网络中可以经过的最大路由跳数&#xff08;或最大转发时间&#xff09;&#xff0c;确保数据包不会在网络中无休止地转发。TTL…