栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

初级C++:string类的实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

初级C++:string类的实现

文章目录
  • 构造函数 、深度拷贝构造、swap
  • resize 、 reserve
  • 重载 [ ] 访问、 赋值重载 =
  • += 重载、 c_str
  • getinline
  • 输入输出操作符重载:<< 、>>

最常用的,底层还是对字符串数组的操作

构造函数 、深度拷贝构造、swap
string(const char* s)
	:_size(strlen(s))	/防止是无参空串 ,先测长度
	, _cap(_size)
{
	_a = new char[_cap + 1];
	strcpy(_a, s); 		/字符串拷贝到实例化的新对象这里
}
--------------------------------------------------Swap
void swap(string& s)
{
算法里面的swap
	::swap(_a, s._a);
	::swap(_size, s._size);
	::swap(_cap, s._cap);
}

template  /简单的swap模板
void swap(T &a, T &b)   
{
    T temp = a;
    a = b;
    b = temp;
}
---------------------------------------------深度拷贝构造
string(const string& s)
	:_a(nullptr)
{
	string tmp(s._a);      临时tmp出了这个域自动析构
	/ ===  this->swap(tmp)
	swap(tmp);
}
resize 、 reserve

size开空间,并初始化;serve只对cap扩容负责

void resize(size_t n, char ch='0')
{
	/小于直接腰斩
	if (n<=_size)
	{
		_size = n;
		_a[_size] = '';  /不传默认用 0 
	}
	else
	{
		if (n>_cap)
		{
			reserve(n);     /开n个就好了
		}
		for (size_t i = _size; i < n; i++)
		{
			_a[_size] = ch;   /新开的初始化
		}
		_size = n;
		_a[_size] = '';
	}
}
---------------------------------------------Reserve
void  reserve(size_t n)
{
	/开辟一块儿新的空间,拷贝源空间,销毁原空间
	if (n>_cap)
	{
		char* tmp = new char[n + 1];
		strcpy(tmp, _a);
		delete[] _a;
		_a = tmp;
		/size  没变 容量变化了
		_cap = n;
	}
}
重载 [ ] 访问、 赋值重载 =

字符串数组访问,返回字符

char& operator[](size_t pos)
{
	assert(pos < _size);
	return _a[pos];//*(a+pos)
}

只读的
const char& operator[](size_t pos)const
{
	assert(pos < _size);
	return*(_a + pos); /_a[pos];
}
-----------------------------------------------------赋值重载
string& operator=(const string& s)
	{
		if (this != &s)
			{
			string tmp(s._str);
			swap(_str, tmp._str);
			}

			return *this;
	}

+= 重载、 c_str
/字符 
string& operator+=(char ch)
{
	string::push_back(ch);
	return *this;
}
/字符串
string& operator+=(const char* s)
{
	string::append(s);
	return *this;
}
void append(const char* s)
{
	/追加的字符串的长度
	size_t len = strlen(s);
	if (_size+len>=_cap)          /大于容量,扩容
	{
		reserve(_size + len);
	}
	/原字符长度尾部开始复制
	strcpy(_a + _size, s);
	_size += len;
}
字符串对象
string&  operator+=(const string& s)
{
	*this += s._a;
	return *this;
}
--------------------------------------------C_str
/c_str,返回对象的字符串
const char* c_str()
		{
			return _str;
		}

getinline

从输入流输入数据,存到对象里,遇到’n’结束输入

/输入流的类型
istream& getline(istream& in, string& s)
	{
		s.clear();
		char ch = in.get();
		while (ch != 'n')
		{
			s += ch;
			ch = in.get();
		}
		return in;
	}

	void test_string6()
	{
		string s1;
		getline(cin, s1);
		cout << s1 << endl;
	}
输入输出操作符重载:<< 、>>
输入
	istream& operator>>(istream& in, string& s)
	{
		s.clear();
		char ch;
		ch = in.get();/每次获取一个字符
		while (ch != ' ' && ch != 'n')
		{
			s += ch;
			ch = in.get();
		}

		return in;
	}
输出
	ostream& operator<<(ostream& out, const string& s)
	{
		/ 不管字符数组中的内容是啥,size是多少,就要输出多少个有效字符
		for (size_t i = 0; i < s.size(); ++i)
		{
			out << s[i];
		}

		return out;
	}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/965853.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号