大二寒假读书笔记150127

来源:互联网 发布:影子去除算法 编辑:程序博客网 时间:2024/04/20 05:04

今天下了很大的雪,晚上跟朋友吃罢饭站在路口等绿灯,抬头可以看到路灯光线下的雪,特别特别美。脑海里突然闪过一连串的画面,好像从小时候开始就这么喜欢抬起头看雪。只不过那时候路边的楼没那么高,也不会有颜色斑驳的灯光,路上的车没那么多,妈妈的白头发没那么多,我还只上小学。

1、标准库string类型

用户提供了合适的using声明,编写出来的程序将会变得简短些

#include<string>using std::string;//用std库里的string这个名字,以后有不用写成std::string了
下面看下string标准可提供的几个构造函数

string s1;//默认为空串string s2(s1);//初始化为s1的一个副本,跟复制构造函数有啥不一样?string s3("value");//初始化为一个字符串字面值副本!重点在于为什么这么说,不是你想的那么简单string s4(n,'c');//初始化为字符‘c’的n个副本
Warning FBI:字符串字面值与标准库string类型不是同一种类型。编程时要注意区分它俩

接着,从标准输入读取到string,并将都入的穿存储在s中。string类型的输入操作符:

 读取并忽略开头所有的空白字符(包括不限于空格,换行符,制表符)

读取字符直到再次遇到空白字符,读取终止。

若输入的串是“     Hello world!  ”(开头结尾有空格哟),那么读取的是Hello,绝无任何空格

其他方面和内置类型的相似,也是返回左操作数作为运算结果

另外读取未知数目的string对象,语法跟内置类型也一样。再次强调下,

string s;while(cin>>s);   cout<<s<<endl;
输入操作符返回左操作数,若输入流是有效(未到达文件尾且未遇到无效输入),则执行while循环,反之跳出循环。

2、用getline读取整行文本

getline接受两个参数:输入流对象,string对象。

string s1;while(getline(cin,s1))   cout<<s1<<endl;
注意:getline从输入流的下一行读取(啥叫从下一行读取?这一行不读?),保存内容到string对象,但不包括换行符。同时getline不忽略开头的换行符,遇到换行符getline就停止读入并返回,如果第一个就是换行符,string置为空串。

同样,getline将istream草书作为返回值,也可以用它作为判断条件。

3、一些常用操作。

s.empty()//空串返回true,否则返回false,布尔值s.size()//返回字符个数s1 + s2;//连接两个字符串s1 = s2;//s1内容替换为s2的副本s[n];//返回位置为n的字符,位置从0开始技术
注意:不要把s.size()的值赋给一个int变量,因为它返回的是string类类型的配套类型string::size_type,其使用 与机器无关,记得前面说不能依赖未定义行为么,同时记得s.size()的值是一个unsigned型,保存一个s.size()的最安全的方法就是使用标准库类型size_type。

比大小:大写字母位于小写字母之前,任何一个大写字母小于任何一个小写字母

4、赋值!

string s1,s2 = "The expense of spirit";s1 = s2;

赋值操作需要先释放掉s1占用的相关内存,再分配给s1足够存放s2副本的内存空间,最后把s2中字符复制到新分配的内存空间,就是说s1的内存空间可能改变

5、和字符串字面值的连接

记得1中说string标准库类型跟字符串字面值常量不是一回事,现在来区分下。先放几个例子:

string s1 = "hello";string s2 = "world";string s3 = s1 + ", ";//okstring s4 = "hello" + ", ";//errorstring s5 = s1 + "," + "world";//okstring s6 = "hello" + ", " + s2;//error
s4为什么错?当连接string对象和字符串字面值混合链接操作时,+操作符左右操作数必须至少有一个是string类型的!

s6错的跟s4一样,第一个+操作符使用错误

那s5为什么没错呢?第一个+操作符使用后返回一个新的string对象,然后这个对象跟字符串字面值连接,相当于s3那种情况
6、下标从0开始到s.size()-1结束。跟c的数组很像,不造有没有什么区别。取下标值,然后给下标值赋值也没啥好说的。

有点再说下,取下标的时候,最好定义个string::size_type作为索引变量,如下:

string str = "hello,world";for(string::size_type i = 0;i <= s.size()-1;++i)    cout<<str[i]<<endl;

不过一般说来,索引变量可以是任何可以产生整型值的表达式,只不过实际的索引类型是unsigned的string::size_type

7、下面给出一些适用于string对象的字符操作函数(或者其他任何的char值),这些函数都在cctype头文件中定义。

isalnum(c)  是字母或数字为trueisalpha(c)  是字母为trueiscntrl(c)  是控制字符为trueisdigit(c)  是数字为trueisgraph(c)  不是空格但可可打印为trueislower(c)  是小写字母为trueisupper(c)  是大写字母为trueisspace(c) 是空格为trueispunct(c)  是标点符号为truetolower(c)  返回其小写字母形式toupper(c)  返回其大写字母形式

可打印字符指的是可以显示表示的字符

空白字符是空格、制表符、垂直制表符、回车符、换行符和进纸符*(走纸换页用,比较少见)

8、C++标准可除了定义一些特定于C++的设施外,还包括了C标准库。c标准库头文件命名形式为name.h,在C++中就命名为cname。少了后缀.h,并在头文件名前加了c

7中用到的cctype在c中为ctype.h。

特别地,cname中定义的名字都定义在std内,而.h版本中的名字却不是这样。


0 0
原创粉丝点击