新闻详情

新闻详情

首页 / 资讯中心 / 详情

vector的模拟实现与迭代器失效

发布时间:2026/11/15 15:22:05来源:尧图网络
vector的模拟实现与迭代器失效
目录一简言二构造函数与析构函数1默认构造函数和拷贝构造函数2迭代器区间构造函数3填充构造函数4析构函数5构造时的匹配错误三赋值重载四迭代器相关函数五容量相关函数1空间大小与元素个数2改变容量reverse与数据个数resize3尾插和尾删4,reserve的缺陷与报错六访问与打印容器七迭代器失效一简言模拟实现vector全代码gitee链接https://gitee.com/codelsj-w/test9.15.git私有成员分析vector是C的一个泛型容器需要融入STL体系同时在构造函数等函数中迭代器经常被使用所以vector容器的私有成员可以使用迭代器实现。vector容器的私有成员变量主要由三部分构成vector也可以使用T* _data; size_t _size; size_t _capacitystring也可以使用迭代器不过string的迭代器使用的比较少二构造函数与析构函数泛型容器模版通过T可以让vector中存储任意类型的数据iterator实际就是数据类型指针补充解释const allocator_type alloc allocator_type()这一部分用来指定内存分配器allocator_type这是std::vector类内部的一个类型别名typedef。对于普通的std::vectorintallocator_type实际上就是std::allocatorint。表示按引用传参避免拷贝分配器对象分配器通常是无状态的但拷贝也有开销。const表示在构造函数内部不允许修改这个传入的分配器对象。alloc这是参数的名字。 allocator_type()这是默认参数。意思是如果你在创建vector时不传这个参数编译器会自动帮你构造一个默认的allocator_type对象即使用标准库默认的内存分配器在 C 中STL 容器如vector、list、map被设计为“内存分配”与“对象构造”分离。vector需要动态在堆上申请内存但它不直接用new和delete而是委托给分配器Allocator来做。默认场景下写std::vectorint v;时实际上等价于std::vectorint v(std::allocatorint());。这个默认分配器底层就是调用operator new和operator delete。只有对内存分配有特殊需求的场景下才会使用。1默认构造函数和拷贝构造函数默认构造作用创建一个空的 vector不包含任何元素size() 0capacity() 0。拷贝构造使用另一个同类型的 vectorx来创建一个新的 vector新 vector 包含x中所有元素的深拷贝。2迭代器区间构造函数核心利用迭代器区间[first, last)左闭右开来初始化 vector。它会将区间内的所有元素拷贝到新 vector 中。特点这是最灵活的构造函数。InputIterator可以是任何输入迭代器比如其他容器的迭代器、原生指针3填充构造函数作用创建包含n个元素的 vector每个元素的值都是val的拷贝。参数n要创建的元素个数。val每个元素的初始值。如果省略则使用值初始化对于int是 0对于自定义类会调用默认构造函数4析构函数5构造时的匹配错误三赋值重载两种写法传统写法reserve可以提前开辟空间防止在进行尾插时空间不够时多次进行空间的开辟。现代写法v1 v2 将v2传入拷贝构造一个新的vector容器v借助v容器进行交换原来的容器v2不会改变。四迭代器相关函数五容量相关函数1空间大小与元素个数2改变容量reverse与数据个数resizeresize的实现reverse的实现3尾插和尾删4,reserve的缺陷与报错预期的打印结果为五个相同的字符串但是报错了这是为什么呢根本原因在于深浅拷贝的问题六访问与打印容器访问打印容器容器模版七迭代器失效insert:在指定位置插入元素迭代器失效分析 erase:删除指定位置的元素结合实例分析失效:修改后使用这种方式上面的三种情况都不会出现错误补充模拟实现string类中的insert和erase迭代器函数也有可能造成迭代器失效的问题不过string的迭代器一般使用的很少八题目补充1只出现一次的数字class Solution { public: int singleNumber(vectorint nums) { int num1 0; //对数组当中的每个数的2进制位进行统计加和 for(int i 0;i32;i) { int total 0; for(int n : nums) { if((n i) 1 1) //如果是1就进行 { total; } } if(total % 3) //如果不是三的倍数说明答案的那一位是1 { num1 | (1i); } } return num1; } };解题思路1对数组当中的每个数的每一2进制位进行统计由于相同的数会出现三次不考虑答案这个数的话结果一定为3的倍数或者为0而这个数的这一位可能为0或1如果为1加上之后对3进行整除就会余1;如果是0加上之后对3进行整除就会余0余1的情况就表明答案这个数的这个二进制位为1通过| (1 i)加上即可2数组当中出现次数超过一半的数字
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/15 4:54:16

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/15 2:04:12

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/14 10:11:15

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/14 17:14:38

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/14 16:35:50

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/15 4:06:36

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉