自学内容网 自学内容网

string的模拟实现

模拟实现类

一string的底层逻辑

#pragma once
#include<iostream>
#include<assert.h>
namespace Z {
class string {
public:



string(const char* str="");//""就是\0的意思

~string();
}
#define  _CRT_SECURE_NO_WARNINGS 1
#include"string.h"
namespace Z {

//string::string()
//:_size(0)
//, _capacity(0)
//, _str(new char [1] {'\0'})
//{

//}
string::string(const char* str)
:_size(strlen(str))//都用模板的话要和定义顺序对齐,所以这里只使用一个模板
{
_capacity = _size;
_str = new char[_size + 1];//永远多开一个空间要存'\0'
strcpy(_str, str);
}
string::~string() {
delete[]_str;
_str = nullptr;
_size = 0;
_capacity = 0;


}

二模拟函数

(1)reserve

这里要构造个tmp插入后销毁原来数据

void string::reserve(int n)
{
if (n > _capacity) {
char* tmp = new char[n + 1];//多开一个放'\0'
strcpy(tmp, _str);
delete(_str);
_str = tmp;
_capacity = n;



}



}

(2)push_back append

这两个函数要进行尾插

void string::push_back(char ch) {
if (_size == _capacity) {
reserve(_capacity==0?4:_size * 2);
}
_str[_size] = ch;
_size++;


}
void string::append(const char* str) {
int newcapacity;
if (_size + strlen(str) > _capacity) {
 newcapacity = _capacity * 2;



}
if (newcapacity < _size + strlen(str)) {
newcapacity = _size + strlen(str);
}
reserve(newcapacity);
strcpy(_str + _size, str);
_size = _size + strlen(str);
}

(3)+=

string& string::operator+=(char ch) {
push_back(ch);
return *this;
}
string& string::operator+=(const char* str) {

append(str);
return *this;
}

(4)insert

在这里插入图片描述
在这里插入图片描述

但是头插会出错
pos是size_t 不会为负数,所以要改成int
然后还不行判断条件是end>=pos但是数据类型也不一致
范围小一般向范围大的进行提升
有符号会提升成无符号
然后再把pos强转成int

或者换个方式
在这里插入图片描述

先扩容
在这里插入图片描述

但是这样也是错的

在这里插入图片描述

不想强转的也可以直接用第二种方法
还有就是insert不建议用,时间复杂度太低

npos

在这里插入图片描述

在这里插入图片描述

一般const成员变量不能在声明定义,但是整型npos可以
在这里插入图片描述

(5)erase

在这里插入图片描述

如果 (len==npos||len>=_size-pos)
这就是pos后面位置全部删除
{_str[pos]=‘\0’;
_size=pos;
}

在这里插入图片描述

(6)find

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注意自己赋值给自己的情况
在这里插入图片描述
非成员函数的原因

<<和>>自定类型要自己写

getlin

这里要取一段文字后第一段空格后的字母个数必须要用getlin提取,因为用cin的话会遇到‘ ’终止
在这里插入图片描述

三遍历

(1)[ ]

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


}

这里可以通过[]修改不是const修饰的str.
也有不能修改的

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


}

(2)迭代器

先定义迭代器和反向迭代器
typedef char* iterator;
using reverse_iterator = const char*;

这里也分两种

//迭代器的遍历
iterator begin() {
return _str;
}
iterator end() {
return _str+_size;
}
const reverse_iterator begin()const {
return _str;
}
const reverse_iterator end()const {
return _str + _size;
}



原文地址:https://blog.csdn.net/jjj_mmm/article/details/143949764

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!