《C++ primer》5th读书笔记(chapter3)

chapter 3 字符串、向量和数组

内置类型由C++直接定义,体现了大多数计算机硬件本身具备的能力。而标准库定义了一些更高级性质的类型,它们尚未直接实现到计算机硬件中。

3.1  命名空间的using声明

库函数基本上都属于命名空间std。

形式如下:

  1 using namespace::name;

注意:using 声明不应该出现在头文件中。

3.2 标准库类型string

string表示可变长的字符序列。使用string必须包含string头文件,且声明使用命名空间的std。

1 #include <iostream> 2 using std::string;

3.2.1 string的初始化

 
 
  1 string s1;              // 定义一个空string
  2 string s2 = s1;         // s2是s1的副本,等同于s2(s1)
  3 string s3 = "hello";    // s3是“hello”字符串除了最后一个'\0'结束符的副本
  4 string s4(5,'c');       // 等同于 4="ccccc;
View Code

注意:当用字符串字面值初始化string时,字符串字面值最后的那个默认结束符不会被送过去,string变量是没有结束符的。

使用=的是拷贝初始化(copy initialization),没有等号的是(direct initialization)。

3.2.2 string对象上的操作

在执行读取操作时,string对象会自动忽略开头的空白(空格,制表,换行符等)并从第一个真正的字符开始读起,直到遇到下一个空白为止。

3.2.2.1 读取未知数量的string对象

  1 while(cin >> str)
  2     cout << str <<endl;

上面while语句的条件部分负责在读取时检查流的情况,如果流有效,即没有遇到文件结束符(window用户是ctrl+Z)或非法输入,就一直循环。

每一次Enter都会将缓冲区的所有有效字符逐一输出,用换行间隔。但若想保留文字中的空白符就得用getline函数了。

     getline函数的参数:一个输入流,一个string对象。

     getline函数的功能:从第一个参数给定的输入流读入内容,直到换行符(包括),然后将其存储到第二个参数给定的对象中(不包括换行符)。

     getline函数也会返回流参数,所以也能作为条件使用。

  1 while(getline(cin,line))
  2     cout << line << endl;

以上语句在遇到文件结束符之前,将一直循环,每一次回车后都将cin流缓冲区的内容按原格式输出。读取一行中的行由用户输入的Enter决定,

即从上一次回车之后到这次回车表示一行,而不是根据屏幕上显示的行(屏幕大小不同)。

3.2.2.2 string的empty和size操作

    empty函数功能:根据string对象是否为空返回一个对应的bool值。为空返回true,非空返回false。直接用点操作符.调用。
    size函数功能:返回string对象的长度。(string类型字符串没有字符串结束符'\0')点操作符调用。
    注意:size函数返回值是string::size_type类型,是一个无符号类型。可以用auto和decltype推断这种类型。
其实大多数标准库都定义了几种配套的类型,体现了标准库与机器无关的特性。size_type就是string的配套类型。

3.2.2.3 比较string对象

    逐一比较字符,对大小写敏感。比较原则:"Hello"<"hello"<"hello world"<"hi";即大写字符小于小写字符,前面字符小于后面字符。

2.2.2.4 string相加

1. s1 += s2;      // 将s2加到s1中

字符串也可以和字符字面值以及字符串字面值相加。因为标准库允许把字符串字面值和字符字面值转换成string类型,但是做这种混合运算时,

必须确保+的两侧至少有一个是string类型。

  1 s = s1 + 'a' + 'a' + "ab";    // 正确,初看好像第二个+两端都是字符字面值,但表达式是从左往右计算的,
                                  // 在第一个加号计算完后,s1+'a'就是string类型了
  2 s = 'a' + 'a' + s1 + "ab";    // 错误
  3 s = "ab" + "ab" + s1 + "ab";  // 错误
View Code

切记:字符串字面值和string类型并不一样!!!

3.2.3 处理string对象中的字符

cctype头文件中的函数表

isalnum(c) c为字母或数字时为真
isalpha(c) c为字母时为真
iscntrl(c) c为控制字符时为真
isdigit(c) c为数字时为真
isgraph(c) c不是空格但可打印时为真
islower(c) c为小写字母时为真
isprint(c) c为可打印字符为真(即是空格或具有可视形式)
ispunct(c) c是标点符号时为真(即不是控制字符,数字,字母,可打印空白中的一种)
isspace(c) c是空白时为真(即是空格,横向制表格,纵向制表格,回车,换行,进纸符的一种)
isupper(c) c为大写字母时为真
isxdigit(c) c为十六进制数字时为真
tolower(c) 如果c是大写字母,转换成小写。否则原样返回。
toupper(c) 如果c是小写字母,转换成大写。否则原样返回。
发布了32 篇原创文章 · 获赞 19 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_29506411/article/details/70171796
今日推荐