String模拟实现流插入缓冲区思路与普通思路对比

	istream& operator>> (istream& is, string& str)
	{
		str.clear();
		char ch;
		ch = is.get();
		while (ch != ' ' && ch != '\n')
		{
			str += ch;
			ch = is.get();
		}
		str += '\0';
		return is;
	}

C++的流提取有个成员函数是get(),跟c的scanf的缓冲区不一样,get很好用于读空格和斜杠n。

但是str+=频繁的扩容是消耗大的,如果说reverse扩容可行的话,当然也不知道要开多大空间,所以利用类似缓冲区的实现方法,造一个栈空间上的一块内存进行存储,即buff[128],一般情况用不了太大,栈的使用效率也高,多开的一块空间是留给'\0'的,所以就有了下面一种代码。

istream& operator>> (istream& is, string& str)
	{
		str.clear();
		int i = 0;
		char buff[128];//类似缓冲区的概念
		char ch = is.get();
		while (ch != ' ' && ch != '\n')
		{
			//str += ch;//频繁地扩容消耗太大,利用一个在栈上的空间计数,最后再+=
			buff[i++] = ch;
			if (i == 127)
			{
				buff[i] = '\0';
				str += buff;
				i = 0;
			}	
		}
		if (i != 0)
		{
			buff[i] = '\0';
			str += buff;
		}
		return is;
	}

我觉得这个值得学习。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值