vector的相关内容介绍及模拟实现

一.内容介绍

1.vector是一个模板,不支持流插入和流提取,因为它支持多种方式的输出,不需要局限于流提取的方式

2.关于vector所涉及的函数接口与string类的用法类似,有兴趣可参考小编的另一篇博客

3.vector的迭代器失效问题

1>类似于野指针:原来指向的空间已经被销毁,具体可参考后续inser中扩容后原空间释放,在新空间中,指针位置改变的例子

2>位置意义已经改变:具体可参照erase中删去一个数据后,pos指向的位置不变,但该位置上的内容已经改变

4.vector中的二维数组

例:int array[10][5]

      vector<int> v(5,1);//v是一个含有5个int类型数据的数组

       vector<vector<int>> vv(10,0);//vv是一个含有10个vector<int>类型的数组

二.模拟实现

1.由于vector是类模板,不可以进行声明和定义分离,否则会发生链接错误

2.vector的成员变量:

template<class T>
class vector
{
public:typedef T* iterator;
private:iterator _start;iterator _finish;iterator _end_of_storage;
};

3.size()   和  capacity()

size_t size() const
{return _finish - _start;
}size_t capacity() const
{return _end_of_storage - _start;
}

4.reverse:扩容/预留空间

1>需要注意的一点是要记录原来的有效字符个数,避免之后计算_finish的指向时调用size()时出现两个指针分别位于两块空间内的情况

2>代码实现

void reverse(size_t n)
{if (n > capacity()){//记录原来的有效字符个数,避免释放之后调用size()时出现两个指针分别位于两块空间内size_t old_size = size();iterator tmp = new T[n];//对内置类型可用memcpymemcpy(tmp, _start, sizeof(T) * old_size);delete _start;_start = tmp;_finish = _start + old_size;_end_of_storage = _start + old_size;}
}

5.迭代器的实现

typedef T* iterator;
typedef const T* const_iterator;const_iterator begin() const
{return _start;
}const_iterator end() const
{return _finish;
}iterator begin()
{return _start;
}iterator end()
{return _finish;
}

6.operator[]:下标访问

T& operator[](size_t i)
{assert(i < size());return *(_start + i);
}

7.pop_back

bool empty()
{return _start == _finish;
}void pop_back()
{assert(!empty());--_finish;
}

8.print_vector函数模板的实现

1>注意编译器不能在没有实例化的类模板里取东西,因为它无法区分const_iterator是类型还是静态成员变量,所以vector<T>::const_iterator it前面要加上typename表明它是类型,或者直接用auto让编译器自己去判断it的类型

2>代码实现

template<class T>
void print_vector(const vector<T>& v)
{//auto it=v.begin();typename vector<T>::const_iterator it = v.begin();while (it != v.end()){cout << *it<<" ";++it;}cout << endl;
}

9.insert

void insert(iterator pos, const T& x)
{assert(pos <= _finish);assert(pos>=_start);if (_finish==_end_of_storage){reverse(capacity()==0?4:2*capacity());}iterator end = _finish - 1;while (end >= pos){*(end + 1) = *end;--end;}*pos = x;++_finish;
}

10.erase

1>代码实现

void erase(iterator pos)
{assert(pos >= _start);assert(pos < _finish);iterator it = pos + 1;while (it != _finish){*(it - 1) = *it;++it;}--_finish;
}

2>注意在用遍历法删除数组中某些数字时,需注意新移到原pos位置的数据是否符合删除要求,下面小编以删除数组中2的倍数为例简单介绍一下:

vector<int>::iterator it = v.begin();
while (it != v.end())
{if (*it % 2 == 0){v.erase(it);}else{++it;}
}

11.resize

void resize(size_t n, T val = T())
{if (n < size()){_finish = _start + n;}else{if (n > capacity()){reserve(n);}while (_finish < _start + n){*_finish = val;++_finish;}}
}

12.构造,拷贝构造,析构

/*vector(){}*///C++11 强制生成默认构造vector() = default;//v1(v2)vector(const vector<T>& v){//避免扩容,提高效率reserve(v.size());for (auto& e : v){push_back(e);}}~vector(){if (_start != nullptr){delete[] _start;_start = _finish = _end_of_storage = nullptr;}}

13.operator=

1>普通写法

void clear()
{_finish = _start;
}//v1=v2
vector<T>& operator=(const vector<T>& v)
{clear();reserve(v.size());for (auto& e : v){push_back(e);}return *this;
}

2>现代写法

void swap(vector<T>& v)
{std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_end_of_storage, v._end_of_storage);
}vector<T>& operator=(vector<T>& v)
{swap(v);return *this;
}

14.

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

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

相关文章

后端面试题日常练-day08 【Java基础】

题目 希望这些选择题能够帮助您进行后端面试的准备&#xff0c;答案在文末 Java中的静态变量和实例变量有何区别&#xff1f; a) 静态变量属于类&#xff0c;实例变量属于对象 b) 静态变量只能在静态方法中访问&#xff0c;实例变量只能在实例方法中访问 c) 静态变量在类加载时…

【BUG】已解决:The above exception was the direct cause of the following exception:

The above exception was the direct cause of the following exception: 目录 The above exception was the direct cause of the following exception: 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c…

【杰理蓝牙开发】AC695x 音频部分

本文主要记录 杰理蓝牙audio接口的使用&#xff0c;包括ADC和DAC原理的介绍和API接口的使用。 【杰理蓝牙开发】AC695x 音频部分 0. 个人简介 && 授权须知1. ADC【音频数据采集】硬件部分1.1 单片机引脚1.2 硬件电路设计1.3 MIC 输入通路解释 2. 【DAC】音频信号编解码…

JVM 高级面试题及答案整理,最新面试题

JVM中的垃圾收集器有哪些,它们的工作原理是什么? JVM中的垃圾收集器主要包括以下几种: 1、 Serial收集器:它是一个单线程收集器,工作时会暂停所有其他工作线程("Stop-The-World"),它的优点是简单高效(与其他收集器的单线程比),适用于单核处理器的环境。 2…

stm32F1xx外设GPIO的用法总结

目录 前言一、概念二、主要文件三、库函数和寄存器四、几个数据结构五、使用方式 前言 本文笔记总结stm32F1xx的GPIO的寄存器说明和标准库中的函数说明、用法&#xff0c;使用案例; 一、概念 GPIO为通用输入输出端口的简称&#xff0c;作为主控芯片的一个外设在芯片中是一个…

Super 4PCS配准算法

Nicolas Mellado&#xff0c;CNRS&#xff08;Centre national de la recherche scientifique&#xff0c;法国国家科学研究中心&#xff09;的研究员&#xff0c;在IRIT&#xff08;Institut de Recherche en Informatique de Toulouse&#xff0c;图卢兹计算机科学研究所&…

SAPUI5基础知识20 - 对话框和碎片(Dialogs and Fragments)

1. 背景 在 SAPUI5 中&#xff0c;Fragments 是一种轻量级的 UI 组件&#xff0c;类似于视图&#xff08;Views&#xff09;&#xff0c;但它们没有自己的控制器&#xff08;Controller&#xff09;。Fragments 通常用于定义可以在多个视图中重用的 UI 片段&#xff0c;从而提…

linux系统安装pytorch_中文地址命名实体识别案例

命名实体有关文章参考这篇文章 中文地址命名实体识别训练和预测 win10系统安装cuda环境参考这篇文章 搭建Pytorch的GPU环境超详细 1、下载python https://www.python.org/downloads/release/python-368/ 2、下载python包 https://pypi.org/search/?q=transformers 1、搜…

如何录制电脑内部声音?全方位介绍电脑录音软件:8款在线录音!(2024重新整理)

如何录制电脑内部声音&#xff1f;不管是娱乐圈还是现实生活&#xff0c;【录音】这个功能的重要性不言而喻。而电脑录音已在影视配音、音视频剪辑、会议记录、在线教育等多个领域发光发热&#xff01; 本文将为您推荐8款电脑录音软件&#xff0c;并详细介绍电脑录音的多种方式…

Git 从入门到精通:全面掌握版本控制(IntelliJ IDEA 中 Git 的使用指南)

引言 Git 是目前世界上最流行的版本控制系统&#xff0c;由 Linux 内核的创始人 Linus Torvalds 开发。它不仅拥有强大的分支管理功能&#xff0c;还具备了优秀的合并能力。本文将从 Git 的基本概念开始&#xff0c;逐步深入到 Git 的使用和一些高级技巧。 Git 简介 Git 是一…

Python番外篇:变量是盒子还是标签

引言 前面通过几十篇文章&#xff0c;大概把Python的一些比较实用的基础做了一些介绍&#xff0c;学会这些&#xff0c;基本能应付日常的小的需求开发了&#xff0c;写一些小工具&#xff0c;提高工作的处理效率。 接下来&#xff0c;准备开始进入一个新的篇章&#xff0c;也…

del 语句

使用 del 语句可以删除任何对象&#xff0c;包括字典对象。删除之后&#xff0c;之前的引用将失效&#xff0c;尝试使用该对象会导致 NameError 错误。因此&#xff0c;删除字典对象的命令是 del myDict。 元组 (Tuple) 元组是不可变的&#xff0c;因此你不能修改元组的内容&a…

C#如何引用dll动态链接库文件的注释

1、dll动态库文件项目生成属性中要勾选“XML文档文件” 注意&#xff1a;XML文件的名字切勿修改。 2、添加引用时XML文件要与DLL文件在同一个目录下。 3、如果要是添加引用的时候XML不在相同目录下&#xff0c;之后又将XML文件复制到相同的目录下&#xff0c;需要删除引用&am…

MySQL之索引优化

1、在进行查询时&#xff0c;索引列不能是表达式的一部分&#xff0c;也不能是函数的参数&#xff0c;否则无法使用索引 例如下面的查询不能使用 actor_id 列的索引&#xff1a; #这是错误的 SELECT actor_id FROM sakila.actor WHERE actor_id 1 5; 优化方式&#xff1a;…

微信小程序安装vant组件库和使用

第一步打开终端输入 npm install vant/weapp --save 第二步 npm cache clean --force 第三步 npm i vant/weapp -S --production 第四步在app.json中的usingComponents输入 "van-button": "vant/weapp/button/index" 第五步直接在页面使用 <v…

SSM(Spring + Spring MVC + MyBatis)框架面试三道题

以下是三道关于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架的面试题&#xff0c;由简单到困难进行排列&#xff1a; 1. 简答题&#xff1a;请简述Spring框架的核心特性。 答案&#xff1a; Spring框架的核心特性主要包括以下几个方面&#xff1a; 控制反转…

当设计模式牵手LLM

模版方法模式 何为模版设计模式 想象一下 如果我们要泡一杯茶 我们要循序渐进地 煮水温杯注水浸茶茶水入杯加点配料 如此&#xff0c;泡茶的工序就完成了&#xff0c;那么模板方法模式&#xff0c;相信各位也有了一定的概念&#xff1a;定义了一个算法的骨架&#xff0c;而…

UDP的报文结构及其注意事项

1. 概述 UDP&#xff08;User Datagram Protocol&#xff09;是一种无连接的传输层协议&#xff0c;它提供了一种简单的数据传输服务&#xff0c;不保证数据的可靠传输。在网络通信中&#xff0c;UDP通常用于一些对实时性要求较高、数据量较小、传输延迟较低的应用&#xff0c…

创建一个程序来记录每天的工作日常—6。与chatgpt结合 找一些集 来训练 ,它能自动分类到 其中一个,例如 “打扫卫生” 它会自动分类到 “家务”

改进步骤 数据增强&#xff1a;使用GPT模型生成更多的训练数据。使用更高级的模型&#xff1a;使用BERT或其他预训练的语言模型进行文本分类。经验条和经验值显示&#xff1a;在网页端显示当前的经验值&#xff0c;并添加一个经验条。 数据增强和训练数据集 我们可以通过Ope…

【JVM基础07】——类加载器-什么是类加载器?类加载器有哪些?双亲委派了解吗?

目录 1- 引言&#xff1a;类加载器1-1 类加载器是什么&#xff1f;(What)1-2 为什么要用类加载器&#xff1f; 作用&#xff1a;类加载的过程&#xff1f;(Why) 2- ⭐核心&#xff1a;类加载器详解(How)2-1 类加载器分类2-2 什么是双亲委派模型&#xff1f;2-3 为什么采用双亲委…