每日复习笔记
C++复习笔记
c++ primer笔记
- string类型
就是简单说说自己的一点理解吧。
string类型在我看来是一个有点像内置类型,类似int,double;又有点像一个类类型,使用构造函数创建string类型的对象。
常见的几种初始化string类型的方式:
string s1; //调用默认构造函数,string类型的默认值是空串
string s2(s1); //将s2初始化为另一个对象的副本
string s3("value"); //将s3初始化为一个字符串字面值的副本
string s4(n,'c'); //将s4初始化为字符'c'的n个副本(就是s4包含了n个'c')
通知string类型的对象在我看来也有内置类型的一面,iostream标准库已经内置好了string的读写操作,即通过标准输入输出操作符来读写string对象。
int main(){
string s;
cin >> s;
cout << s <<endl;
return 0;
}
值得小心的是,在从标准输入读取string时:
a.读取时会忽略开头的所有空白字符(例如空格,换行符,制表符)。
b.读取字符知道再次遇见空白字符。
例如,如果程序输入的是“ HELLO WORLD! ”(开头结尾都存在空格)。
int main(){
string s1,s2;
cin >> s1 ;
cin >> s1 >> s2;
cout << s1 <<endl;
cout << s1 << s2 <<endl;
return 0;
}
第一个输出结果是HELLO
第二个输出结果是HELLOWORLD!
如果想读取整行文本可以使用getline函数。
getline函数需要两个参数:一个输入流对象,一个string对象。和输入操作符不一样的是,getline函数并不忽略行开头的换行符。只要遇到换行符,getline函数就会停止读入并返回,哪怕是第一个字符就是换行符。如果第一个就是换行符,则string参数会被置为空string对象。
int main(){
string line;
while(getline(cin,line)){
cout << line << endl;
}
system("pasue");
return 0;
}
分别输入111111 2 3333 55555 和文件结束符的结果:
string对象的操作
操作 | 含义 |
---|---|
s.empty() | 如果s是空串,则返回true,否则返回false |
s.size() | 返回s中字符的个数 |
s[n] | 返回s中位置为n的字符,位置从0开始计数 |
s.empty() | 如果s是空串,则返回true,否则返回false |
s1 + s2 | 把s1和s2连接成一个新字符串,并返回这个新生成的字符串 |
v1 == v2 | 比较v1和v2的内容,如果相等则返回true,否则返回false |
!=,<,<=,>和>= | 保持这些操作符惯有的含义 |
1)size()函数返回值的类型是string::size_type类型,个人认为这是一种无符号的类型。最好存储size()函数的结果用string::size_type类型。特别需要注意的是,不要把size的返回值赋值给一个int型变量。
2)string对象的关系操作符
关系操作符包括了==,!=,<,<=,>和>=
string对象的比较操作是区分大小写的。多数计算机上,大写的字母位于小写字母之前,任何一个大写字母都小于任意的小写字母。
3)string对象和字符串字面值的连接
c++中是支持string对象和字符串字面值直接使用"+"连接的。
但是需要注意的是,在进行string对象和字符串字面值混合连接时,+操作符的左右操作数必须至少有一个是string类型的。
string s1 = "hello";
string s2 = "world";
string s3 = s1 + ","; //OK
string s4 = "hello" + ","; //error,**+**两端都是字符串字面值
string s5 = s1 + "," + "world"; //OK
string s6 = "hello" + "," + s2; //,第一个**+**两端都是字符串字面值。
4)表格中也提到了可以使用下标操作符([])获取string对象中的单个字符。注意,一个string对象的下标是从0开始的。
而且下边操作可以作为左值,
for(string::size_type ix = 0; ix != str.size(); ++ix){
str[ix] = '6';
}
要小心的是:标准库是不检查索引值的,如果索引的下标越界往往会造成严重的运行时错误。