Home > C++ > C++ Primer 学习笔记:标准库类型

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() 这样的小库函数一般定义为内联函数,所以每次循环过程中调用它的运行代价是比较小的。

6. vector不是一种数据类型,而vector<int>,vector<double> 等才是数据类型。

vector ivec4(10,-1)    //创建了具有10个元素均为-1的vector。
vector ivec5(10)        //创建了具有10个元素值均为0的vector。

vector 对象及其它标准库窗口对象的重要属性在于可以在运行时高效地添加元素。因为vector增长的效率高,在元素值已知的情况下,最好是动态地添加元素。即使可以对给定元素个数的vector预先分配内存,但更有效的方法是初始化一个空的vector对象,然后再动态地增加元素。

7. vector的下标操作不添加元素,如:

vector ivec;
for(vector::size_type ix = 0; ix != 10; ++ix)
ivec[ix]=ix; // 错误,因为ivec并没有元素。

for(vector::size_type ix = 0; ix != 10; ++ix)
ivec.push_back(ix); // 正确。

也就是说,必须是已经存在的元素才能用下标操作符进行索引,通过下标操作进行赋值时,不会添加任何元素。

8. 迭代器是一种检查容器内元素并遍历元素的数据类型。标准库为每一种标准容器都定义了相应的迭代器类型,但只有少数容器支持下标的操作。因为迭代器对所有容器都适用,所以现代C++更倾向于使用迭代器而不是下标来访问容器元素,即使对支持下标操作的vector类型也是这样。

9. end() 操作返回的是vector未端元素的下一个,它指向一个并不存在的元素。如果容器为空,则返回的迭代器与begin() 返回的相同。

10. 迭代器的算术操作

  • iter+n 及 iter – n :可以对迭代器对象加上或者减去一个整形值,这样将产生一个新的迭代器,其位置在iter所指元素的前n及后n个位置。加上或者减去的类型应当是size_type或difference_type类型。
  • iter1- iter2:计算两个迭代器对象的距离,此距离是名为difference_type的singed类型的值,因为减法可能产生负数的结果。此类型可以保证足够大以存储任何两个迭代器对象间的距离。iter1和iter2都必须指向同一个容器中的元素,或者指向vector末端之后的下一个元素。

任何改变vector长度的操作都会使已经存在的迭代器失效。例如调用push_back之后,就不能再信赖指向vector的迭代器的值了。

11. 中的count() 方法返回的是size_t的类型,size_t类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版本,它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。

相对于C++内置数据类型的数组和指针而言,程序员应当优先使用标准库的类型。

Related posts:

  1. C++ Primer 学习笔记:数组和指针 (2)
  2. C++ Primer 学习笔记:变量和类型
  3. C++ Primer 学习笔记:数组和指针 (1)
Categories: C++ Tags:
  1. No comments yet.
  1. No trackbacks yet.