《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;
}

如有错误,恳请指正。

相关推荐
ForteScarlet12 分钟前
Kotlin 2.2.20 现已发布!下个版本的特性抢先看!
android·开发语言·kotlin·jetbrains
anlogic21 分钟前
Java基础 9.10
java·开发语言·算法
yongche_shi26 分钟前
第二篇:Python“装包”与“拆包”的艺术:可迭代对象、迭代器、生成器
开发语言·python·面试·面试宝典·生成器·拆包·装包
Elastic 中国社区官方博客1 小时前
介绍 Python Elasticsearch Client 的 ES|QL 查询构建器
大数据·开发语言·数据库·python·elasticsearch·搜索引擎·全文检索
Hóng xīng qiáo1 小时前
swVBA自学笔记014、Lisp适合对SolidWorks进行二次开发吗 ?
开发语言·笔记·lisp
一拳一个呆瓜1 小时前
【MFC】对话框:位置属性(居中、绝对对齐、X位置Y位置)应用示例
c++·mfc
m0_552200821 小时前
《UE5_C++多人TPS完整教程》学习笔记48 ——《P49 瞄准偏移(Aim Offset)》
c++·游戏·ue5
带鱼吃猫1 小时前
C++的诗行:一文读懂C++的继承机制
开发语言·c++·学习·visual studio
John_ToDebug1 小时前
Chrome 核心事件循环揭秘:TaskSequenceManager 与 MessagePump 的设计与实现
c++·chrome
好多171 小时前
《Java中的IO流》
java·开发语言·php