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的初始化
View Code1 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;
注意:当用字符串字面值初始化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相加
字符串也可以和字符字面值以及字符串字面值相加。因为标准库允许把字符串字面值和字符字面值转换成string类型,但是做这种混合运算时,
必须确保+的两侧至少有一个是string类型。
1 s = s1 + 'a' + 'a' + "ab"; // 正确,初看好像第二个+两端都是字符字面值,但表达式是从左往右计算的,
// 在第一个加号计算完后,s1+'a'就是string类型了 2 s = 'a' + 'a' + s1 + "ab"; // 错误 3 s = "ab" + "ab" + s1 + "ab"; // 错误
切记:字符串字面值和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是小写字母,转换成大写。否则原样返回。 |