码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++模拟实现vector


    目录

    1.代码实现

    2.注意事项

    1.成员变量

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

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

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

    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指针!

     

  • 相关阅读:
    基于TCP的聊天系统
    【stm32芯片设置解惑】:stm32F103系列的开漏输出和推挽输出的区别
    c++ ffmpeg 浅谈YUV444、YUV422、YUV420(2)
    太厉害了,终于有人能把TCP/IP 协议讲的明明白白了
    计算机毕业设计Java哈尔滨旅游项目推荐平台演示录像2020(源码+系统+mysql数据库+Lw文档)
    Linux之initd管理系统(海思、ZYNQ、复旦微)添加密码登录验证
    一千题,No.0077(计算谱半径)
    yum安装jdk环境
    什么是Soulbound灵魂绑定代币?Web3去中心化社会的基石
    地表最帅缓存Caffeine
  • 原文地址:https://blog.csdn.net/Qianxueban/article/details/131815257
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号