C++模拟实现vector

目录

1.代码实现

2.注意事项

1.成员变量

[2. 不能使用memcpy函数拷贝数据](#2. 不能使用memcpy函数拷贝数据)

1.用string类型测试时,要考虑到vs可能把数据存储在数组buffer里面

3.insert函数中指针的失效性

[1.加引用,那么就不能传常量,比如v.begin() + 3](#1.加引用,那么就不能传常量,比如v.begin() + 3)

2.加引用,就只能传变量了

4.erase成员函数的指针的失效性


1.代码实现

2.注意事项

1.成员变量

这边以作者目前的能力,还不知道为什么不想string类一样,弄头指针,size, capacity成员变量一样,所以也只能目前跟着底层小小的模拟实现一下。

2. 不能使用memcpy函数拷贝数据

如果使用memcpy函数拷贝,如果是vector<内置类型>倒也没有问题,但是如果是自定义类型,比如string类型,那么memcpy只会浅拷贝一下,就是之间原封不动的拷贝一下,那么_str的指针也是一样的,那么下一步delete\[\]_start就已经把_str给释放掉了,那么再调用就会出错了。

1.用string类型测试时,要考虑到vs可能把数据存储在数组buffer里面

有些人看了我上面说自定义类型不可以,比如string类型,有些人就像自己尝试一下。但是vs在string类型中做了小小的优化。它的成员变量不仅仅有_str, _size, _capacity。vs把string做了优化,他认为我们在调用得时候大部分都是很小的字符串,他就用一个数组存储起来了。

你可以用你vs软件测试一下,创建一个string类型,比如string s, 然后再sizeof(s),看看其大小。不同系统还不一样,2019是28,说明存储了16字节大小的数组。16 + 8(_str) + 4(_size) + 4(_capacity).但2022就是40, 我想应该存储了32个字节,优化时,扩大了一倍。

(Liunx系统下的g++软件,答案是8,还有待我去探索,我会更新)

3.insert函数中指针的失效性

在插入时,输入的是原地址的pos,但是如果插入后的内存不够,就会扩容,这边的扩容是是不会在原来的位置扩容的,所以pos的值会变化,所以我们在函数外应用的形参pos就会失效。但有些人就会说了,那为什么不用引用呢?

1.加引用,那么就不能传常量,比如v.begin() + 3

有人还说,加个const不就好了,那就本末倒置了,pos是要改变的,所以底层就只能弄一个返回值,让你接收他。

2.加引用,就只能传变量了

引用是不可以传任何带计算的。v.begin()就不可以作为形参传值了。做个简单的例子。

4.erase成员函数的指针的失效性

原理和insert一样,为什么要分开来说呢,有人说,如果不是删除最后一个,那么其他删除,pos肯定有效的值,是可以拜访的。但是由于vs系统做了检查,所以就完全不可以用的。但是Linux下g++系统是允许再次拜访的。但是重点来了,代码要有一个性质就是:可移植性!!!

所以这边建议不用erase后的pos指针!

相关推荐
冻柠檬飞冰走茶7 分钟前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
TunerT_TQ1 小时前
Valhalla 静态工程审阅 #018|MMCV 源码证据驱动评测【大厂开源基础设施特辑】
c++·开源·mfc·#计算机视觉·#商汤科技·#openmmlab·#静态源码审计
山峰哥1 小时前
数据库工程与SQL调优:从慢查询到秒级响应的实战之路
java·开发语言·数据库·sql·深度优先·启发式算法
wangjialelele1 小时前
Selenium4 + Java Web自动化测试入门指南:从环境搭建到常用操作详解
java·开发语言·前端·测试工具·自动化
Awna1 小时前
Golang 大小写可见性规范
开发语言·后端·golang
别动我齐刘海2 小时前
Day6 unitree_G1人形机器人GMR—— MotionInput
c语言·c++·人工智能·学习·机器学习·机器人·github
AI科技星2 小时前
曲率‑挠率与 $\boldsymbol{\omega/c}$ 的关系、精算验证及其物理意义
c语言·开发语言·线性代数·算法·决策树·机器学习·ai科技星
Henry Zhu1232 小时前
C++17 `weak_from_this` 详解:让对象安全地观察自己
c++
鹿角片ljp3 小时前
Java框架篇:Spring + SpringMVC + SpringBoot + MyBatis深度复习
java·开发语言
xlxxy_4 小时前
外部系统调用SAP接口遇到的一些报错
开发语言·数据库·sap·abap