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;
}
我觉得这个值得学习。