文章目录

  • 前言
  • 1. string的结构
  • 2. 构造、析构
    • 2.1 无参构造
    • 2.2 带参构造
    • 2.3 问题发现及修改
      • c_str
      • operator []
      • 析构
    • 2.4 合二为一 ——全缺省
  • 3. 拷贝构造
    • 3.1 浅拷贝的默认拷贝构造
    • 3.2 深拷贝拷贝构造的实现
  • 4. 赋值重载
    • 4.1 浅拷贝的默认赋值重载
    • 4.2 深拷贝赋值重载的实现
  • 5. string对象的遍历
    • 5.1 【】(const版本和非const版本)
    • 5.2 迭代器模拟实现(普通)
    • 5.3 const迭代器模拟实现
  • 6. 常见关系运算符重载
  • 7. 数据插入删除及扩容操作
    • 7.1 reserve
    • 7.2 push_back和append
    • 7.3 +=
    • 7.4 resize
    • 7.5 insert
    • 7.6 erase
  • 8. swap和find
  • 9. 流插入<< 和 流提取>>重载
    • 9.1 流插入<<重载
    • 9.2 reverse修改
    • 9.3 流提取>>重载
  • 10. 写时拷贝(了解)
  • 11. 源码展示
    • string .h
    • test.cpp

前言

在上两篇中,我们已经学习了string类的一个使用,并且做了一些相关的OJ练习,相信大家现在对于string的使用已经没什么问题了。
那我们这篇文章呢,就来带大家对string进行一个模拟实现,这篇文章过后,有些地方大家或许就可以理解的更深刻一点。

1. string的结构

那通过之前文章的学习我们已经对string有了一些了解了:

我们知道,string的底层其实就是一个支持动态增长的字符数组,就像我们数据结构里面学的动态的顺序表
那确定了它的结构,接下来我们就开始模拟实现它。

我们来新建一个头文件string.h,定义一个string类:

class string
{public:
//成员函数
private:char* _str;size_t _size;size_t _capacity;
};

string类的成员变量有3个,一个字符指针_str指向开辟的动态数组,_size标识有效数据个数,_capacity记录容量的大小(不包含'\0')。
相信经过之前数据结构的学习,大家很容易就能明白它们的含义。

但是:

我们现在是要自己实现一个string类,而标准库里面已经有string类了。
所以,为了避免冲突,我们可以定义一个命名空间,把我们自己实现的string放到我们自己的命名空间里面。

namespace yin
{class string{public:private:char* _str;size_t _size;size_t _capacity;};
}

命名空间的名字,大家可以自己起。

2. 构造、析构

接下来我们来模拟实现一个构造函数:

2.1 无参构造

首先我们提供一个无参的默认构造函数

string():_str(nullptr),_size(0),_capacity(0)
{}

可以直接在初始化列表初始化。

2.2 带参构造

那我们再来写一个带参的构造函数:

string(const char* str):_str(str),_size(strlen(str)),_capacity(strlen(str)){}

2.3 问题发现及修改

这里是用一个常量字符串去初始化我们的string对象。
但是呢?

我们发现这里报错了,为什么?

【C++】深度剖析string类的底层结构及其模拟实现相关推荐

  1. 深度剖析E680G应用三.目录结构

    深度剖析E680G应用三.目录结构 草木瓜 相关资源下载 http://play.younet.com/view.php?tid=18578 一.前言 本文主要介绍E680g系统应用相关的重要文件和目 ...

  2. 复旦邱锡鹏:深度剖析 ChatGPT 类大语言模型的关键技术

    内容来源:ChatGPT 及大模型专题研讨会 分享嘉宾:复旦大学教授 邱锡鹏 分享主题:<对话式大型语言模型> 转载自CSDN稿件 求职/进NLP群->加入NLP交流群 ChapGP ...

  3. java字符串常量池长度_Java String类相关知识梳理(含字符串常量池(String Pool)知识)...

    目录 1. String类是什么 1.1 定义 1.2 类结构 1.3 所在的包 2. String类的底层数据结构 3. 关于 intern() 方法(重点) 3.1 作用 3.2 字符串常量池(S ...

  4. 冰冰学习笔记:string类的简单模拟

    欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正. 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬.帅哥.美女点点支 ...

  5. STL之string类:知其然,需知其所以然

    目录 前言 一,构造及初始化 1.1constuct类函数 1.2构造函数及其模拟实现 1.3拷贝构造及其模拟实现 1.4赋值操作符 1.5string类的swap接口 二,迭代器 2.1初识迭代器即 ...

  6. 深度剖析E680I/G应用[转贴]

    深度剖析E680G应用一 所谓的Loader 一.写在前面的话 E680G,已不能简单理解为手机,而是一台实实在在运行Linux操作系统的个人掌上电脑! 本文试图通过探讨E680G操作系统的架构,打造 ...

  7. 学习String类和日期Date类,看这一篇就够了

    写在前面,Java基础系列文章都是作者基于b站尚硅谷的Java基础视频所做的笔记,没有时间的同学可以认真看看,如果有时间的同学,还是建议看看视频,毕竟笔记说到底还是自己的东西,每个人的习惯也是不一样的 ...

  8. 阿里最新面试必备项之Java的String类,持续更新中!

    最新腾讯面试必备项之Java的String类,持续更新中! 1.1 String的特性 String类:代表字符串.Java程序中的所有字符串字面值(如"abc")都作为此类的实例 ...

  9. 《C++中STL引入和string类常用接口+自我实现-》

    前言 在这篇博客里将详细说说C++中的STL,通过这篇我们可以学习到什么是STL,以及STL的六大组件,STL具有的缺陷,最后看看string类及面试会让模拟实现string类的操作. 文章目录 前言 ...

最新文章

  1. MAC复用和逻辑信道优先级
  2. ceph编译_Ceph编译:L版本及其之后的版本
  3. Precision和Recall
  4. oracle集群图例
  5. 开源一些Delphi系统:诗词成语字典
  6. 团队-科学技术器-模块测试过程
  7. 进程间同步(互斥量、信号量)
  8. win10子系统linux编译ffmpeg
  9. 在godaddy的空间上发布使用MySql 和 Entity Framework做的网站时遇到的Security Exception...
  10. DDD:四色原型、DDD、DCI之间的关系
  11. stylus 设置全局样式_在vue-cli 3中, 给stylus、sass样式传入共享的全局变量
  12. 部署ftp文件共享服务
  13. Macromedia Studio 8 简体中文正式版激活码
  14. 用友t3 服务器通讯协议,远程登陆用友t3服务器
  15. 自偏置电流镜设计实例
  16. 牛客网 月出皎兮,佼人僚兮。 树上启发式合并
  17. 在线标注协作服务Hypothes.is的简明教程
  18. 4x root 红米_红米Note 4X root教程_红米Note4X获取root权限的方法
  19. iOS混合开发之uni-app本地打包集成到iOS原生项目
  20. 从源数据库抽取数据到中间库

热门文章

  1. Centos7 使用cobbler搭建PXE网络装机服务器安装Centos、Windows、PE、自定义wim镜像
  2. 评测TFN F4 高性能OTDR光时域反射仪性能
  3. EXFO MAX-710B光时域反射仪OTDR主要功能
  4. 5G笔记| 概述:5G网络架构(NSA/SA组网)、无线资源控制RRC、语音通话
  5. JdbcTemplate的使用
  6. PyCharm打包可执行文件方法
  7. 统一身份认证子系统界面设计与实现
  8. JDBC模拟SQL注入和避免SQL注入
  9. MySQL的TRUNCATE()函数
  10. smalltalk五个特性