当前位置: 首页 > article >正文

C++初阶学习第七弹——string的模拟实现

C++初阶学习第六弹------标准库中的string类_c语言返回string-CSDN博客 

通过上篇我们已经学习到了string类的基本使用,这里我们就试着模拟实现一些,我们主要实现一些常用到的函数。

 

目录

 

一、string类的构造

 二、string类的拷贝构造

三、string类的析构函数

四.基本的函数实现

1.reserve的函数实现

 2.find函数的实现

 3.push_back函数的实现

4.insert函数的实现


一、string类的构造

//为了区分标准库,我们用String
class String
{
public:
    String(const char* str = "")
    {
        if (str == nullptr)
        {
            assert(false);
            return;
        }
        _str = new char[strlen(str) + 1];
        strcpy(_str, str);
    }
    void String_print()
    {
        cout << _str << endl;
    }
private:
    char* _str;
};
int main()
{
    String s1("abc");
    s1.String_print();
    return 0;
}

有一个点要注意的是在给默认参数的时候不要给"\0"或者是空格。

 二、string类的拷贝构造

class String
{
public:
    String(const char* str = "")
    {
        if (str == nullptr)
        {
            assert(false);
            return;
        }
        _str = new char[strlen(str) + 1];
        strcpy(_str, str);
    }
    String(const String& s)
        : _str(new char[strlen(s._str) + 1])
    {
        strcpy(_str, s._str);
    }
    void String_print()
    {
        cout << _str << endl;
    }
private:
    char* _str;
};
int main()
{
    String s1("abc");
    s1.String_print();
    String s2(s1);
    s2.String_print();
    return 0;
}

三、string类的析构函数

由于string类对象不管以哪个方式创建时,都需要用new来开辟空间,所以string的析构函数写法为:

   ~string()
{
	if (_str)
	{
		delete[]_str;
		_str = nullptr;
		_size = _capacity = 0;
	}
}

四.基本的函数实现

1.reserve的函数实现

void string::reserve(size_t n)
{
	if (n > _capacity)
	{
			
		char*ret = new char[n + 1];
		strcpy(ret, _str);
			_str = ret;
			_capacity = n + 1;
	}
}

 2.find函数的实现

size_t string::find(char ch, size_t pos)
{
	assert(pos < _size);
	for (size_t i = pos; pos < _size; i++)
	{
		if (_str[i] == ch)
		{
			return i;
		}
	}
	return npos;
}

 3.push_back函数的实现

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

4.insert函数的实现

void string::insert(size_t pos, char ch)
{
	assert(pos <= _size);

	if (_size == _capacity)
	{
		reserve(_capacity == 0 ? 4 : _capacity * 2);

	}
	int end = _size + 1;
	while (end > pos)
	{
		_str[end] = _str[end - 1];
		end--;
	}
	_str[end] = ch;
	_size++;
}


http://www.kler.cn/news/353730.html

相关文章:

  • 基于STM32的节能家庭管家系统设计
  • Spring AI Java程序员的AI之Spring AI(一)
  • 看《米小圈日记魔法》突破写作困境一点也不难!
  • 小红的行列式构造
  • Java微信支付接入(10)API V3 申请退款API
  • 深度学习500问——Chapter17:模型压缩及移动端部署(4)
  • 【环境搭建】远程服务器搭建ElasticSearch
  • python取字典的任意一项的value
  • pytorh学习笔记——手写数字识别mnist
  • Linux 命令—— ping、telnet、curl、wget(网络连接相关命令)
  • 改变TikTok零播放情况的6个解决方法
  • C++学习笔记----9、发现继承的技巧(一)---- 使用继承构建类(1)
  • OpenVAS—— 强大的开源漏洞扫描工具从安装到使用全攻略
  • Java工具类--OkHttp工具类
  • indicatorTree-v10练习(有问题)
  • Leetcode 跳跃游戏 二
  • Elasticsearch介绍和使用
  • Java项目:157 基于springboot技术的美食烹饪互动平台的设计与实现(含论文+说明文档)
  • Android应用性能优化的方法
  • 【哈工大_操作系统理论】L2223 多级页表与快表段页结合的实际内存管理