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

C++之string源代码详解

stiring 相比于c的char 要方便多了,string里有很多的库函数,现在我们来把库函数的实现讲解下

#include<iostream>

#include<string.h>

#include<assert.h>

using namespace std;
namespace WGX//建一个空间域
{
	class string
	{
	public:
		typedef char* iterator;//迭代器
		typedef const char* const_iterator;
		const_iterator begin() const
		{
			return _str;
		}
		const_iterator end()const
		{
			return _str + _size;
		}
		iterator begin()
		{
			return _str;
		}
		iterator end()
		{
			return _str + _size;
		}
		string(const char* str="")//构造函数
			:_size(strlen(str))
			,_capacity(_size)
		{
			_str = new char[_capacity + 1];
			strcpy(_str, str);
		}
		//string(const string& s) // 传统写法
		//	:_size(s._size)
		//	,_capacity(s._capacity)
		//{
		//	_str = new char[_capacity + 1];
		//	strcpy(_str, s._str);
		//}
		void swap(string& s)
		{
			std::swap(_str, s._str);
			std::swap(_size, s._size);
			std::swap(_capacity, s._capacity);
		}
		string(const string& s)
			:_str(nullptr)
			,_size(0)
			,_capacity(0)
		{
			string tmp(s._str);
			swap(tmp);
		}
		//string operator =(string& s)//传统写法
		//{
		//	if (this != &s)
		//	{
		//		string tmp(s);
		//		_str = new char[strlen(s._str) + 1];
		//		strcpy(_str, tmp._str);
		//		_size = s._size;
		//		_capacity = s._capacity;
		//	}
		//	return *this;
		//}
		string operator =(string s)//现代写法
		{
			swap(s);//s是传值,相当与赋值,构造了一个函数
			return *this;
		}
		~string()
		{
			delete _str;
			_str = nullptr;
			_size = 0;
			_capacity = 0;
		}
		size_t size()
		{
			return _size;
		}
		const char* c_str()
		{
			return _str;
		}
		char& operator[](size_t pos)
		{
			assert(pos < _size);
			return _str[pos];
		}
		const char& operator[](size_t pos)const
		{
			assert(pos < _size);
			return _str[pos];
		}
		void reserve(size_t n)
		{
			if (n > _capacity)
			{
				char* tmp = new char[n + 1];
				strcpy(tmp, _str);
				delete _str;
				_str = tmp;//tmp是个临时变量,出了作用域就会自动销毁
				_capacity = n;
			}
		}
		void resize(size_t n,char ch='\0')
		{
			if (n <= _size)
			{
				_size = n;
				_str[_size] = '\0';
			}
			else
			{
				if (n > _capacity)
				{
					reserve(n);
				}
				memset(_str + _size, ch, n - _size);
				_size = n;
				_str[_size] = '\0';
			}
		}
		void push_back(char ch)
		{
			if (_size ==_capacity)
			{
				reserve(_capacity == 0 ? 4 : 2 * _capacity);
			}
			_str[_size] = ch;
			_size++;
			_str[_size] = '\0';
		}
		void append(char* str)
		{
			size_t len = strlen(str);
			if (_size + len > _capacity)
			{
				reserve(_size + len);
			}
			strcpy(_str + _size, str);
			_size = _size + len;
		}
		string& operator+=(char ch)
		{
			push_back(ch);
			return *this;
		}
		string& operator+=(char* str)
		{
			append(str);
			return *this;
		}
		size_t find(char ch)
		{
			for (size_t i = 0; i < _size; i++)
			{
				if (_str[i] == ch)
				{
					return i;
				}
			}
			return npos;
		}
		size_t find(char* str, size_t pos = 0)
		{
			const char* ptr = strstr(_str+pos,str);
            return ptr-_str;//返回位置,把字串的地址,减去字符串的地址,就是位置了
		}
	private:
		char* _str;
		std::size_t _size;
		std::size_t _capacity;
		static const size_t npos;
		
	};
	 const size_t string::npos = -1;
}

相关文章:

  • 电话号码组合(力扣)
  • vim的基本用法
  • 进程的概念(详解)
  • Linux 基础知识详解
  • 命名管道的学习
  • 牛客网之参数解析问题
  • 力扣-找公共祖先问题
  • 二叉搜索树与双向链表问题
  • 从前序与中序遍历序列中构造二叉树
  • C++程序调用C的静态库和C程序调用c的静态库
  • C++模板初阶
  • Linux下的共享内存
  • 定长内存池详解
  • 可重入函数详解
  • AVL树四种旋转的详细图解
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【刷算法】求1+2+3+...+n
  • Android Studio:GIT提交项目到远程仓库
  • Angularjs之国际化
  • HTML5新特性总结
  • Java小白进阶笔记(3)-初级面向对象
  • Netty源码解析1-Buffer
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • ViewService——一种保证客户端与服务端同步的方法
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 给初学者:JavaScript 中数组操作注意点
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 温故知新之javascript面向对象
  • 正则表达式
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • #pragma data_seg 共享数据区(转)
  • (1)Android开发优化---------UI优化
  • (1)bark-ml
  • (10)ATF MMU转换表
  • (2)nginx 安装、启停
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (笔试题)分解质因式
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)程序员疫苗:代码注入
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .FileZilla的使用和主动模式被动模式介绍
  • .form文件_SSM框架文件上传篇
  • .net framework profiles /.net framework 配置
  • .Net多线程总结
  • [ SNOI 2013 ] Quare
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [Android]如何调试Native memory crash issue
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [C#]DataTable常用操作总结【转】
  • [HDU5685]Problem A