标准库类型string
- 标准库类型string表示可变长的字符序列,使用#include<string>引入头文件,string定义在命名空间std中。
定义和初始化string对象
- 如何初始化类的对象是由类的本身决定的,类可以定义很多初始化对象的方式,但是这些方式之间必须有所不同,不同体现在初始值的数量、类型。
- 常用的初始化的例子
string s1; //空字符串
string s2(s1); //将s1作为s2的初始值
string s2 = s1; //和上面的一致string s3("Value"); //给s3赋value值
string s3 = "value"; //和上面一致string s4(n,'c'); //s4 = n个c
直接初始化和拷贝初始化
- = 拷贝初始化,将等号右侧的初始值拷贝到新创建的对象中去
- 不使用等号,则执行的是直接初始化
string对象上的操作
- 一个类除了要规定初始化其对象的方式外,还要定义对象上所能执行的操作。
- 类既可以定义通过函数名字调用的操作,还可以定义<<、+等各种运算符在此类的对象上的新的含义。
- os<<s 将s写到输出流os中,返回s
- is>>s 从is中读取字符串赋值给s,字符串以空白分割,返回is
- getline(is,s) 从is中读取一行赋值给s,返回is
- s.empty() s为空返回true。否则返回false
- s.size() 返回s中的字符的个数
- s[n] 返回s中第n个字符的引用,位置n从0开始计算
- s1+s2 返回字符串s1和s2拼接的效果
- s1 = s2 使用s2的副本代替s1中原来的字符
- s1 == s2 如果s1和s2的字符完全一致,则他们相等
- s1 != s2
- <、<=、>、>= 按照字典顺序比较大小,且大小写比较敏感
读写string对象
- 读取操作的时候,string对象会自动忽略开头的空白(空格符、换行符、指标符),并从第一个真正的字符开始读起,直到遇见下一处的空白为止。例如输入“ Hello ”,接收的却是“Hello”,输出的结果中没有空格。
- 多个输入或者输出可以连写在一起。
读写未知数量的string对象
int main(int argc,char **argv){string word;while(cin >> word){cout << word << endl;}return 0;
}
使用getline读取一行
- 保留输入的时候的空白符号,使用getline()替代先前的>>运算符号
- getline只要一遇到换行符号就会结束读取操作并且返回结果,即使一开始输入的就是换行符号,那么返回的就是空字符串。
int main(int argc,char **argv){string word;while(getline(cin,word)){cout << word << endl;}return 0;
}
string的size操作
- size函数返回的是一个string::size_type类型的值,这是一个无符号类型的数值,而且可以存放下任何string对象的大小。在C++11中允许使用auto或者decltype来判断变量的类型。
- 如果表达式已经有了size()函数既不要使用int了,可以避免混用int和unsigned可能带来的问题。
比较string对象
- ==和!=分别校验两个对象相等还是不相等。相等是指两个对象的长度和所蕴含的字符完全一致。
- < <= >= > 和先前的认知是一致的,比较区分大小写,按照字典序来比
- 如果两个字符一短一长,短的所有位数和长的先前位数是一致的,那么小的小于长的
- 如果在某些位置上面元素不一致,以第一对相异字符比较结果作为整体比较结果。
两个string对象相加
- 这个 + 符号和Java是一样的,默认是字符串的拼接
- 如果将string对象、字符字面值和字符串字面值混在一起使用,需要保障每一个加法运算符 + 的两侧的运算符对象至少有一个是string。
string s1 = "Hello";string s2 = "World";string s3 = s1 + "," + s2 + '\n';string s4 = s1 + ",";string s5 = "Hello" + "\n";//错误,两个运算对象都不是stringstring s6 = s1 + "," + "World";string s7 = "Hello " + "," + s2;//错误,不能把字面值直接相加
处理string对象中的字符
引入cctype头文件就可以引入一些标准库函数来处理字符
isalnum(c) | c是字母或者数字为真 |
isalpha(c) | c是字母为真 |
iscntrl(c) | c是控制字符为真 |
isdigit(c) | c是数字为真 |
isgraph(c) | c不是空格但是可以打印的时候为真 |
islower(c) | c是小写字母为真 |
isprint(c) | c可打印为真(c是空格或者c具有可见的形式) |
ispunct(c) | c标点符号为真 |
isspace(c) | c空白为真 |
issupper(c) | c大写字母为真 |
isxdigit(c) | c是十六进制为真 |
tolower(c) | 若c大写,则转化为小写字母 |
toupper(c) | 若c小写,则转化为大写字母 |
- C++在兼容C语言的库,去掉.h,在头文件的名字前面增加字母c即可。
使用for来处理每一个字符
- 将每一个字符改成小写
int main(int argc,char **argv){string s = "HELLO WORLD!!!";for(auto &c : s) { //对于s中的每一个字符,其中&表示引用c = tolower(c); //c是一个引用,因此赋值语句将会改变c的数值}cout << s << endl;return 0;
}
- 处理特定位置的字符:1,使用下标;2,使用迭代器
- 下标运算符号[] 接收的输入值是string::size_type类型的数值,这个参数表示的是访问字符的位置,返回的是该位置上字符的引用。字符对象的下标从0开始计算,最大的下标是s[s.size()-1]
补充知识
- decltype关键字用于查询表达式的类型
- 详细的参考链接地址 https://blog.csdn.net/caoshangpa/article/details/79129258