整理自C++Primer PP75-83
1.使用string类型必须包含以下头文件
#include <string>
using std::string;
2.定义和初始化string对象
格式 | 初始化string对象的方式 |
---|---|
string s1 | 默认初始化,s1是一个空串 |
string s2(s1) | s2是s1的副本 |
string s2=s1 | 等价于s2(s1),s2是s1的副本 |
string s3(“value”) | s3是字面值”value”的副本,除了字面值最后的空字符外 |
string s3 = “value” | 等价于s3(“value”),s3是字面值”value”的副本 |
string s4(n, ‘c’) | 把s4初始化为由连续n个字符c组成的串 |
拷贝初始化和直接初始化
拷贝初始化:使用(=)初始化一个变量 string s = “hiya”;
直接初始化:不使用等号string s (“hiya”) ;
当初始值只有一个时,使用直接和拷贝都可以;
如果初始值有多个,一般来说只能使用直接初始化的方式。
3.string对象上的操作
格式 | string的操作 |
---|---|
os<<s | 将s写到输出流os当中,返回os |
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对象
cin>>s;
执行读取操作时,string对象会自动忽略开头的空白并从第一个真正的字符开始读起,直到遇见下一个空白为止;
cin>>s1>>s2;//把第一个输入读到s1中,第二个输入读到s2中
使用getline读取一整行
getline遇到换行符停止(注意换行符也被读进来了),然后把所读内容存到string对象中(不存换行符)。
比较string对象的两个规则
1.如果两个string对象的长度不同,而且较短string对象的每个字符都与较长string对象对应位置上的字符相同,就说较短string对象小于较长string对象;
2.如果两个string对象在某些对应的位置不一致,则string对象比较的结果是string对象中第一对相异字符比较的结果。
基于范围的for语句
如果想对string对象中的每个字符做点什么操作,目前最好的办法是使用C++11新标准提供的一种语句,范围for(range for)语句。这种语句遍历给定序列中的每个元素并对序列中的每个值执行某种操作,其语法形式是:
for(declaration: expression)
statement
其中,expression部分是一个对象,用于表示一个序列。
declaration部分负责定义一个变量,该变量将被用于访问序列的基础元素。每次迭代,declaration部分的变量会被初始化为expression部分的下一个元素值。
string str(“some”);
for (auto c : str) //对于str的每个字符
cout << c << endl; //输出当前字符,后面紧跟一个换行符
通过使用auto关键字让编译器决定变量c的类型,这里c是char,每次迭代,str的下一个字符被拷贝给c,因此该循环可以读作”对于字符串str中的每个字符c“执行某某操作。