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

《C++探幽:STL(string类源码的简易实现(上))》

作者的个人gitee▶️

作者的算法讲解主页

每日一言:“心有繁星,皆为皓月。🌸🌸”

上一章已经对string类进行了简单的介绍,大家只要能够正常使用即可。在面试中,面试官总喜欢让学生自己来模拟实现string类,最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。

本文就主要针对该部分的源码进行剖析。

string.h

#include<assert.h>
#include<string.h>

//重新定义命名空间域以防与标准库冲突
namespace Poeir_
{
    //封装string类
    class string
    {
    public:
        //迭代器
        typedef char* iterator;
		typedef const char* const_iterator;

		iterator begin();
		iterator end();
		const_iterator begin() const;
		const_iterator end() const;
        
        
        //无参构造
        string()
            :_str(new char[1]{'\0'})
            ,_size(0)
            ,_capacity(0)
            {}
        //带参构造
        string(const char* str)
            :_str(new char[strlen(str)+1])
            ,_size(strlen(str))
            _capacity(strlen(str))
            {}
         //上述代码效率不好,因为strlen是一个运行时调用的函数,时间复杂度是O(n)。
         //字符串越长,时间开销越大,且容易因为声明顺序导致错误。
        //也不能使用sizeof,因为它是编译时运算,但它只能运算数组,不能运算string。
        //优化如下:将_str和_capacity放到内部初始化,防止初始化列表容易因为声明顺序导致错误。
          string(const char* str = "")
            :_size(strlen(str))
            {
               _capacity = _size;
               _str = new char[_size + 1];
                strcpy(_str,str);
          	}
        
        
        //返回c风格字符串
        //
        const char* c_str() const
        {
            return _str;
        }
        
        //析构函数销毁字符串
        ~string ()
        {
            delete[] _str;
            _str = nullptr;
            _size = 0;
            _capacity = 0;
        }
        
        //size()方法声明
        size_t size() const;
        //[]运算符重载声明
		char& operator[](size_t i);//普通版
		const char& operator[](size_t i) const;//const版

    private:
        char* _str;
        //_size和_capacity都不包含'\0'
        size_t _size;
        size_t _capacity:
    }
}

string.cpp

#include"string.h"

🔴一.size()方法

size_t string::size() const
{
    return _size;
}

🔴二.[ ]运算符重载

char& string::operator[](size_t i)
{
	assert(i < _size);
	return _str[i];
}
const char& string::operator[](size_t i) const
{
    assert(i<_size);
    return _str[i];
}

🔴三.迭代器

begin()

string::iterator string::begin()//普通版
{
	return _str;//返回首元素地址
}
string::const_iterator string::begin() const  //const版
{
	return _str;
}

end()

string::iterator string::end()//普通版
{
	return _str + _size;//返回最后一个元素的地址
}
string::const_iterator string::end() const  //const版
{
	return _str + _size;
}

如有错误,恳请指正。

相关文章:

  • 免费送源码:Java+ssm+MySQL 校园二手书销售平台设计与实现 计算机毕业设计原创定制
  • lower_bound 和 upper_bound 是两个强大的二分查找函数
  • Vue基础知识21-30
  • 55.跳跃游戏
  • 《比特城的七重结界:从数据洪流到量子盾牌的终极守护》
  • ZooKeeper集群部署(容器)
  • 如何深入理解C#中的备忘录模式(Memento Pattern)设计模式
  • Git常用问题收集
  • 创作五周年纪:数据之路的星光与远方
  • 深入理解 C++ 内置数组(四十三)
  • ​docker加docker compose实现软件快速安装启动
  • 唯美社区源码AM社区同款源码
  • 【MySQL | 八、 事务管理】
  • STM32F4系列ADC模块:原理、配置与实战应用
  • 【C++11(下)】—— 我与C++的不解之缘(三十二)
  • Python星球日记 - 第6天:列表与元组
  • 【大语言模型推理框架】VLLM
  • 左值与右值,空间与数据
  • Leetcode 3510. Minimum Pair Removal to Sort Array II
  • java基础自用笔记:文件、递归、常见的字符集、IO流
  • 深圳市龙华区网站建设/论坛推广的步骤
  • 阿克苏网站建设服务/今日十大头条新闻
  • 展会网站怎么做/灰色词优化培训
  • 沙河网站建设/如何推广新产品的方法
  • 国外做任务网站/网站收录免费咨询
  • 佛山做网站的/18款禁用网站app直播