String类型的注意事项

1、string类型是可变长字符序列,而vector是集合,存放的是某种类型的可变长序列

2、string类型对象的初始化有多种方式:string str="Hello",是将字符串字面值除了最后一个空字符'‘,作为副本,拷贝给str。

3、string类型对象的拷贝初始化,是使用等号(=),是将等号右边的值拷贝一份用来给左边的值初始化;而直接初始化则不使用等号,若初始值只有一个,两者皆可,但是若是多个初始值,则使用直接初始化。

4、多个初始值初始化string对象也可以使用拷贝初始化,但是要借助临时量(对象),来存放多个初始值,然后在进行拷贝初始化。

5、string类的操作:is>>s  表示从is中读取字符串赋值给s,字符串以空白分隔,返回is。s1==s2,s1!=s2  string对象的相等性判断,对字母大小写敏感。

6、string类对象末尾没有‘’,字符串字面值的末尾有''。

7、string对象从标准输入读取内容,若内容的前面有空白,即忽略,知道遇到真正的字符才开始读取,到遇到下一次空白结束。

8、若想保留输入中的空白,可以通过getline()函数,getline()函数可以从输入流读取一整行,并且包括空白符,getline(cin,word)。其中cin是输入流,word是string对象。使用getline函数时word不包括换行符,

若要换行,需自行加上endl,使用endl结束当前行并刷新缓冲区。

9、string::size_type其实是一个无符号类型的值,并且拥有足够存下任何string对象的大小,因此用来存放string类的size()函数的返回值的变量,都应该是string::size_type类型的。不要使用int去接受size()返回值

因为,int类型是带符号数,而string::size_type是无符号数,两者若同时存在于同一个表达式中,带符号数将会转成无符号数,若int是负数,则会出错。

10、decltype类型和auto类型,都能用在string::size_type类型上,进行推断其类型。

11、当把string对象和字符字面值、字符串字面值放在一条语句中使用,即string str1=str1+'a'+str2+"aaaa";  必须保证加号两端的运算对象至少有一个是string类的对象,否则编译器会编译出错。

12、string str1=str1+'a'+"aaa";  这样也符合要求,编译器也认得出来。先执行第一个加号,得到的是一个string对象,这样第二个加号两端一样有一个是string类对象,故合法。

13、标准库类型string,和字符串字面值类型不同,是因为历史遗留原因,为了兼容C语言。

14、若想处理string类型的对象的每个字符,可以使用C++11新标准的范围for语句:遍历给定序列的每个元素,并对序列中每个元素的值执行某种操作。

  for(declaration :expression)

    statement

  declaration:就是用来访问序列中元素,expression:就是序列,是一个对象,statement:每次遍历一次(迭代),就会被初始化为expression序列的下一个元素值,一般这里是对其执行的某种操作。

15、若是使用范围for语句想要修改string对象中字符的值,则declaration中定义的用来访问序列的变量需要使用引用,通过引用去修改其每个字符的值。而statement每次迭代就会将引用绑定到下一个序列元素。

16、string类对象可以使用下标运算符([ ])处理序列中的字符,与数组一样,下标运算符最小参数值是0,最大是对象大小减一。不能出现越界操作,不然会出现无法预知的结果,所以使用下标运算符访问空string对象

也会出现无法预知的结果。

17、下标的值称为index索引或者下标,由于下标运算符接收的参数是string::size_type类型,即无符号类型的值,如果索引值是带符号类型,会被自动转换成无符号类型。

18、不管什么情况下,若使用下标运算符访问string对象的值,那么要检查其访问的位置上是否是空,是否有值,不然会出现未定义行为。

19、下标运算符返回的是索引值位置上的字符的引用,只要字符不是常量,就可以为其赋新值。

20、如果想读取一个char类型的字符串,并且包括空格、制表符、换行符,也要读取进来应该使用cin的成员get()函数,这是由于cin>>ch会忽略掉这些空白符,并且在遇到第一个空白符时停止。前者默认遇到换行符结束,但是并不会在缓冲区中丢弃掉换行符

原文地址:https://www.cnblogs.com/Dark-King/p/9379731.html