前言:

本篇博客仅仅实现存储字符的string,由于C++string出现的时间较早可能起到示例作用,C++string库设计的不合理,这里博主仅实现一些最常见的增删查改接口!

由于string底层是一个char类型的顺序表,接下来给出的接口都是基于以下框架:

代码语言:javascript

AI代码解释

namespzce  achieveString
{
   class string
    {
       private:
               char* _str;
               size_t _capacity;
               size_t _size;
     }
   
}
一、 string(相关默认成员函数)默认构造、析构函数、拷贝构造、赋值重载
1.1默认构造:

小问题:

(1)c++标准库中,无参构造并不是为空而是结尾要有一个标识符'\0’,所以不能直接置为空指针(nullptr),应该开一个字节,并存放'\0'。(c++支持无参构造一个对象后,直接可以对其进行增删查改,也从侧面说明了这点)

(2)顺序问题:这里如果我们三次使用strlen()函数,由于该函数是一个运行时才调用的函数,如果调用三次效率就不高,这时候就有人认为先初始化_size,在使用_size来初始化其他成员变量,但是成员变量初始化顺序是由声明是确定的这时我们可以最先声明_size(这是一个解决方法,但是这也引出一个问题就是成员变量声明顺序是确定的[被捆绑],此时如果有一个改变了成员变量声明顺序就会引发一系列问题)显然这种方法有不行,最优解决方法是_size在初始化列表初始化,其他成员变量用已初始化的_size在函数体内初始化。

(3)在string中_capacity 和_size都不包含标识字符'\0'所以构造时要多开一个空间,用于储存'\0'

1.2 析构函数

1.3拷贝构造【注意标识符'\0'问题即可】
1.3.1传统写法(什么都自己亲历亲力为)

1.3.2现代写法:核心在于:将拷贝数据的工作交给别人来做,最后调用交换函数(swap()),将结果互换一下即可【能不自己做就不自己做】

1.4赋值重载
1.4.1传统写法(什么都自己亲历亲力为)

1.4.2现代写法【能不自己做就不自己做】

二 迭代器和范围for

在C++中,范围for的底层是通过迭代器来实现的。所以只要实现了迭代器,也就支持范围for。而迭代器类似于指针一下这些某个位置,可以理解为是指针的一种泛型化,它提供了类似指针的功能。由于变量用普通变量和const变量所以迭代器也有普通迭代器和const迭代器。以下提供了const迭代器和非const迭代器【反向迭代器少用自己可以下去实现】


 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐