C++_string增删查改模拟
本篇博客仅仅实现存储字符的string,由于C++string出现的时间较早可能起到示例作用,C++string库设计的不合理,这里博主仅实现一些最常见的增删查改接口!由于string底层是一个char类型的顺序表,接下来给出的接口都是基于以下框架:代码语言:javascriptAI代码解释private:char* _str;在C++中,范围for的底层是通过迭代器来实现的。所以只要实现了迭代器
前言:
本篇博客仅仅实现存储字符的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迭代器【反向迭代器少用自己可以下去实现】

三 元素相关:重载operator[ ](两种)
这里我们和库里提供两个版本,一种只读一种可读可写

四 容量相关:size、capacity、reserve、resize、clear、
4.1size、capacity

4.2 reserve
在C++中,我们一般不用于缩容(由于n<_capacity[当前容量]时,是否缩容是不确定的在计算机中要不不确定当作确定【不然会出错】所以不能用于缩容量),所以这里我们只用reserve实现扩容。
(1)首先判断n是否大于当前容量,如果小于就不做处理
(2)如果大于,就先开辟(n+1)个内存空间[多出来的一个用于储存'\0',然后将原有数据拷贝到新空间(strcpy函数会将'\0'拷贝过去)。然后释放旧空间,并让_str指向新空间,同时更新相应的_capacity;

4.3 resize

(1)当n<_size时,有效字符会减少,此时只须将下标为n的位置数据改为'\0',在将_size赋值为n
(2)其他情况,我们和在一起处理。直接复用reserve()函数,将_capacity扩到n,在将[_size,n)的数据进行初始化,如果参数指定了用什么字符初始化就用什么字符初始化,默认使用'\0‘初始化。
更多推荐



所有评论(0)