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

作者的个人gitee▶️

作者的算法讲解主页

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

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

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

string.h

cpp 复制代码
#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()方法

cpp 复制代码
size_t string::size() const
{
    return _size;
}

🔴二.[ ]运算符重载

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

🔴三.迭代器

begin()

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

end()

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

如有错误,恳请指正。

相关推荐
DpHard14 分钟前
自用Vscode 配置c++ debug环境
c++·ide·vscode
风逸hhh44 分钟前
python打卡day29@浙大疏锦行
开发语言·前端·python
ᖰ・◡・ᖳ1 小时前
JavaScript:PC端特效--缓动动画
开发语言·前端·javascript·css·学习·html5
hy____1231 小时前
C++多态的详细讲解
开发语言·c++
superior tigre1 小时前
C++学习:六个月从基础到就业——C++20:范围(Ranges)进阶
c++·学习·c++20
小葡萄20251 小时前
黑马程序员C++2024版笔记 第0章 C++入门
开发语言·c++·笔记
万物此臻1 小时前
C#编写软件添加菜单栏
开发语言·c#
不二一2 小时前
linux c++头文件生成源文件 使用python脚本 配置vim快捷键
linux·c++·python
RongSen332 小时前
Python海龟绘图(Turtle Graphics)核心函数和关键要点
开发语言·python
小贾要学习2 小时前
【C语言】贪吃蛇小游戏
c语言·开发语言·游戏