第三章 标准库类型
关于C++的几篇博客,参考人民邮电出版社的《C++ Primer 中文版》一书。
本章着重介绍标准库中的string、vector、bitset类。
第一节 标准库string类
一、string对象的初始化方式
方式 | 含义 |
---|---|
string s1 | 调用string类的默认构造函数,为空串 |
string s2(s1) | 将s2初始化为s1的一个副本 |
string s3("value") | 将s3初始化为一个字符串字面值副本 |
string s4(n, 'c') | 将s4初始化为字符‘c’的n个副本 |
二、string对象的读写
例1:
string s;
cin >> s;
cout << s << endl;
输入:" Hello World! "(注意开头和结尾有多个空格)
输出:"Hello" (不含任何空格)
例2:
string s1, s2;
cin >> s1 >> s2;
cout << s1 << s2 << endl;
输入:同上
输出:"HelloWorld!" (注意没有任何空格,Hello和World中间也没有空格)
由上述两个例子总结得出:
1、string类型的输入操作符,读取并忽略开头所有的空白字符;当再次遇到空白字符,读取终止。
2、输入输出操作符返回左操作数,作为运算结果。这点和内置类型的输入输出操作是一致的。
例3:
string line;
// read line at time until end-of-file
while ( getline ( cin, line ) )
cout << line << endl;
说明:getline函数从输入流的下一行读取,读到下一个换行符出现为止,不包括换行符。当getline函数返回EOF(end of file)时,while的判读语句为false,则终止getline读取循环,认为输入流的数据已读完。
三、string对象的操作
s.empty() | 如果s为空串,则返回true |
s.size() | 返回s中字符的个数(注意不要和C的字符数组混淆,string结尾没有'\0'空字符,所以返回的string长度就是实际字符的个数) |
s[n] | 略 |
s1 + s2 | s1和s2前后串联成一个新字符串 |
s1 = s2 | 将s1替换为s2的副本 |
v1 == v2 | 比较两个string(注意两点:第一,比较时区分大小写,大写小于小写;第二,如果短字符串真包含于长字符串,则短的小于长的) |
!=, <, <=, >, >= | 比较字符串时,规则同上 |
两点注意:
1、string的 '+' 操作符,左右操作数必须有至少一个string对象。
例4:
string s1 = "hello";
string s2 = "world";
string s3 = s1 + ", "; // ok
string s4 = "hello" + ", "; // error
string s5 = s1 + ", " + "world"; // ok
string s6 = "hello" + ", " + s2; // error
2、关于string::size_type类型:
* 它是 string.size() 成员函数的返回类型。
* 它也是string[n]读取单个字符时,字符索引n所应该表示的数据类型。
size_type是string的配套类型(companion type),它定义为与unsigned(unsigned int 或者 unsigned long)型具有相同的定义。
note:对于任意给定数据类型,它的unsigned型所能表示的最大正数值比对应的signed型要大一倍。
所以,为防止溢出,当用成员函数所size()或用索引读取单个字符时,返回值或索引的数据类型最好定义为string::size_type类。
四、string对象中字符的处理
isalnum(c) | 若为字母或数字,则返回真 |
isalpha(c) | 若为字母,则返回真 |
iscntrl(c) | 若为控制字符则返回真 |
isdigit(c) | 若为数字则返回真 |
isgraph(c) | 如果c不是空格,但可打印,则返回真 |
islower(c) | 若为小写字母则返回真 |
isprint(c) | 若为可打印字符则返回真 |
ispunct(c) | 若为标点符号则返回真 |
isspace(c) | 若为空白字符,则为真 |
isupper(c) | 若为大写字母则返回真 |
isxdigit(c) | 若为16进制数,则返回真 |
tolower(c) | 返回小写字母 |
toupper(c) | 返回大写字母 |
说明:
可打印字符:可以显式表示的字符
空白字符:空格、制表符、回车符、换行符等
标点符号:除数字、字母、可打印的空白字符(如空格)以外的其他可打印字符
注意:
C++标准库包括C标准库。C++中的头文件cctype其实就是利用了C标准库函数,这些函数就定义在C标准库中的cype.h中。(C标准库头文件命名为name.h,C++命名为cname,加c表示该头文件源自C标准库。)因此这两个文件内容是一样的,只是后者采用了更适合C++程序的形式。cname头文件中定义的名字都定在命名空间std内,但name.h则不是这样的。所以,C++程序通常采用cname这种头文件版本,而不采用name.h,这是为了让标准库中的名字都一致属于std命名空间,以防给程序带来负担。