好久没有更新博客了,今天来走一波c++。最近学习的是string与stringstream类型。
刚开始我看着这两尊佛有点懵,搞不清楚它们的意义何在,如果说string是取代字符数组更方便使用的话,你们stringstream是干什么的,参考了《算法竞赛入门经典》(第二版)(俗称紫书)、《c++ primer plus》还有一些博客,大概明白了是怎么回事。
所谓string类,它的头文件是<string>,注意前面没有c后面也没有.h。附上头文件截图一张,注意里面的<istream>,它有大作用。
在c语言中,我们如果要操作字符数组,只能依靠<string.h>这个头文件所提供的字符串操作函数,当然你说我是自己定义函数的话╮(╯▽╰)╭,当我没说。出场率比较高的函数大概就是strlen、strcmp、strcpy、strcat这些了,但是既然是函数,那也就意味着在使用上会有些复杂,毕竟要调用函数嘛。
但是,在c++,作为一门旨在面向对象编程的语言,当然不可能再像c语言那样繁杂,一切都给你打包好,然后放在了<string>头文件里。
string是一个类型,取代了字符数组的位置用来保存字符串。 示例:
string str1 = "abcd", str2 = "efg";
这就是一个字符串了,是不是很简洁明了啊?(*^_^*)
不需要指定大小,只要给一个名字来表示该字符串就好啦,如果要从键盘上获取数据的话,可以用cin >> str;
如果想要实现类似于strcat函数的效果的话很简单:
str1 += str2;
对,你没看错,只需要+=就像是在操作int、double一样,输出str1你就会得到“abcdefg”。
cout << str1 + str2 << endl;
这种方式输出的结果和上面的一样,但是str1的话并没有改变,相信它的含义你们应该猜得出来。
and......没有 -,别想了。
至于copy函数......没错( •̀ ω •́ )✧就是等号大大了:
str1 = str2;
这时你输出str1将会得到“efg”,也就是把str2赋给了str1。那么这么多方便的东西是哪来的呢?
就是<string>头文件啦,里面重载了n多类似于+、+=、=这些运算符,都封装进去了,我们只需要直接用就好了,值得一提的是,string很慢,方便的代价当然是效率啦╮(╯▽╰)╭。
那么<sstream>又是干什么的呢?
上面是<sstream>头文件的部分截图,相信观察力敏锐的童鞋已经注意到了#include <string>这行代码,对,它包含了<string>。从头文件的名字我们也可以看出来string流(*^_^*),而它的作用,就是让字符串能像流一样读写它还提供了一个新类型stringstream。
string line;
getline(cin, line);
stringstream ss(line);
上面几行代码的大概做了这么几件事:
1、声明了一个string类的变量储存了输入的第一行的所有字符;
2、把这些字符复制给了stringstream类型的变量ss;
当我们做完这些操作后,我们就可以对ss进行流的读写操作了,比如说这样:
int nums[20], i = 0, sum = 0;
while(ss >> nums[i]){
sum += nums[i];
i++;
}
其他的代码我相信都知道,主要的是ss >> nums[i];这里,就是流的运算啦,它会把里面的数字流给nums[i],而且以空格区分两个数据。值得注意的是,当执行之后ss里的数据流就没有了,和水很像,流过去了,这里就没有了。
简而言之,我说的这些东西给我们操作字符串提供了很大的便利,至于效率嘛.....这是没办法的事情。以后有机会我会继续更新的。