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

C++之vector类的代码及其逻辑详解 (中)

我们已经初步认识了vetcor以及他的一些接口,那么接下来我们根据这些信息来实现vector以及其接口。

1. iterator

下面这两行不是必须的,但是建议写上,因为这样可以防止我们写出来的代码报入底层,对代码进行跟好的封装。

typedef T* iterator;

typedef const T* const_iterator;

2. private成员

  • _start:指向容器中第一个元素的位置。
  • _finish:指向容器中最后一个元素的下一个位置。
  • _endofstorage:指向容器预留内存空间的末尾位置。

我们之所以要设计一个_endofstorage就是让_endofstorage和_finish在相遇的时候扩容。

private:iterator _start;iterator _finish;iterator _endofstorage;

3. 构造函数

这是vector的构造函数,即使用resize来对其直接进行初始化。

PS:假如说 vector里面存储的是 Date日期类对象,  构造 vector对象的时候,调用 vector(int n, const T& val = T()) ,此时 T的类型是 Date,调用的是Date的默认构造来生成缺省值,然后调用 resize(n,val)  此时 resize的时候,你传了val那就不会生成缺省的,如果不传,调用的也是Date的构造函数生成缺省参数。简单来说,在使用构造函数的时候里面这个resize的val调用的是默认构造,而不是说这个构造函数。

vector(size_t n, const T& val = T())
{resize(n, val);
}

4. 析构函数

这个就是析构函数,先通过delete清理掉数组,然后把三个指针都指向0。

~vector()
{delete[] _start;_start = _finish = _endofstorage = 0;
}

5. 拷贝构造

拷贝构造的作用不用多说,就是为了防止发生浅拷贝。

简单来说,就是先让this指针的_start指向一个新开辟好大小的数组,然后通过循环的方式进行赋值,接着让this指针的_finish和_endofstorage指向新的空间。

vector(const vector<T>& v)
{_start = new T[v.capacity()];for (size_t i = 0; i < v.size(); i++){_start[i] = v._start[i];}_finish =_start+v.size();_endofstorage = _start + v.capacity();
}

6. 默认构造函数

简单来说就是让这三个指针都先指向空。

默认构造函数和构造函数之间是不冲突的

vector():_start(nullptr), _finish(nullptr), _endofstorage(nullptr)
{}

7. 范围构造函数

这个叫做范围构造函数,简单来说就是通过两个指针分别指向一段元素范围,然后用那段范围来初始化vetcor。

template<class InputIterator>
vector(InputIterator first, InputIterator last)
{while (first != last){push_back(*first);++first;}
}

8. begin()

这个就是返回vector的开头位置。

iterator begin()
{return _start;
}

这个的话也是返回vector的开头位置,只不过加了两个const,他们的作用如下:

const 位置作用目的
返回类型 const_iterator限制迭代器的写权限确保通过迭代器只能读取元素,不能修改(即使容器本身是非 const 的)
函数声明 () const限制函数的修改权限允许 const 对象调用该函数,并保证函数内部不会修改对象状态

一般来说这两个const是成对出现的。 

const_iterator begin() const
{return _start;
}

9. end()

返回最后一个的下一个。这种设计是为了方便迭代器进行遍历,比如说走一个循环,如果这个迭代器和end()的返回值相等那就代表遍历完了。

iterator end()
{return _finish;
}​
const_iterator end() const
{return _finish;
}

10. erase()

这个函数用于销毁指定位置的元素。简单来说就是覆盖,把后面的一个一个往前挪,最后--_finish。

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

11.  pop_back()

 这个函数就是尾删,首先检查vector是不是空,如果是空那就报错,不是的话就直接--_finish,让用户访问不到就可以了。

void pop_back()
{assert(_start != _finish);--_finish;
}
http://www.xdnf.cn/news/16831.html

相关文章:

  • DockerFile文件执行docker bulid自动构建镜像
  • CMake指令:mark_as_advanced
  • Python序列去重高级指南:保持顺序的高效去重技术
  • 错误: 找不到或无法加载主类 原因: java.lang.ClassNotFoundException
  • 云原生三剑客:Kubernetes + Docker + Spring Cloud 实战指南与深度整合
  • 分类任务当中常见指标 F1分数、recall、准确率分别是什么含义
  • 类似 Pixso 但更侧重「网页 / 软件界面设计」「前后端可视化开发」的工具
  • 【贪心】P11112 [ROI 2024] 机器人物流 (Day 1)|普及+
  • 基于python多光谱遥感数据处理、图像分类、定量评估及机器学习方法应用
  • Java函数式编程之【Stream终止操作】【下】【二】【收集器toMap()】【叁参数收集操作collect()】
  • Maven项目和Spring项目的异同
  • 企业资产|企业资产管理系统|基于springboot企业资产管理系统设计与实现(源码+数据库+文档)
  • Docker容器中文PDF生成解决方案
  • 计算机网络:为什么IPv6没有选择使用点分十进制
  • Pytorch-02数据集和数据加载器的基本原理和基本操作
  • Matplotlib - Python图表可视化利器
  • 面试小总结
  • vue引入阿里巴巴矢量图库的方式
  • 内网穿透系列十:高性能内网穿透工具 rathole,支持Docker一键部署
  • ubuntu 系统风扇控制软件 CoolerControl
  • AI驱动SEO关键词智能进化
  • Ubuntu18网络连接不上也ping不通网络配置问题排查与解决方法
  • Python 第一阶段测试题 答案及解析
  • 【正点原子K210连载】第二十四章 按键输入实验 摘自【正点原子】DNK210使用指南-CanMV版指南
  • Linux iptables防火墙操作
  • SQL 四大语言分类详解:DDL、DML、DCL、DQL
  • 【Go语言-Day 29】从time.Now()到Ticker:Go语言time包实战指南
  • C#开发入门指南_学习笔记
  • 【DL学习笔记】DL入门指南
  • 从数据丢失到动画流畅:React状态同步与远程数据加载全解析