C++ Primer 学习笔记:标准库类型
C++ Primer 学习笔记二:标准库类型
1. 有一种情况下,必须总是使用完全限定的标准库名字:在头文件中。因为头文件的内容会被预处理器复制到程序中。用#include包含文件时,相当于头文件中的文本将成为我们编写的文件的一部分。如果在头文件中放置using声明,就相当于每个包含此头文件的程序都放置了同一using声明,不论该程序是否需要using声明。而通常,头文件中只应当定义确实必要的东西。
2. 字符串字面值与标准库中的string并不是同一个类型,这是因为历史的原因及C兼容性。
当进行string对象和字符串字面值混合连接操作时,+ 操作符的左右操作数必须至少有一个是string类型的:
string str = "hello " + "world" // 非法 string str0 = "world"; string str1 = "hello" + ", " + str0 // 非法
3. 从标准输入读取string,将:
- 读取并忽略开头所有的空白字符(如空格,换行符,制表符)
- 读取字符直到再次遇到空白字符,读取终止。
例如,如果输入为:’ hello world ‘,则实际保存的是: ‘hello’
一种不常见的初始化方式为:
string str(n,c):将str初始化为字符 c 的n个副本。
4. string.empty() 将返回bool值,判断是否为空串。
5. string:size_type。因为string::size()返回的是string::size_type类型的值,string类类型和许多其它库类型都定义了一些配套类型,通过这些配套类型,库类型的使用就可以与机器无关,size_type定义为与unsigned类型(unsigned int或者unsigned long)具有相同的含义,而且可以保证足够大的能够存储任意string对象的长度。为了使用由string类型定义的size_type类型,必须加上string::来限定所使用的size_type是由string类定义的。
任何存储string的size操作结果的变量必须为string::size_type类型。特别重要的是,不要把size的返回值赋给一个int变量,这是为了避免溢出现象的发生。
对于vector,则应当使用vector::size_type。
并且,习惯用!=而不是 <来编写循环判断条件,如:
for(vector::size_type ix = 0; ix ! = vec.size(); ++ ix) { }
并且,由于string, vector都是可以动态增长的,因此倾向于在每次循环时测试size的当前值,而不是在进入循环前就存储size值的副本。像size() 这样的小库函数一般定义为内联函数,所以每次循环过程中调用它的运行代价是比较小的。
评论