1、使用using声明可以在不需要加前缀namespace_name::的情况下访问命名空间中的名字。using声明的形式如下:

using namespace::name;    // 如using std::cout;

有一种情况下,必须总是使用完全限定的标准库名字:在头文件中。理由是头文件的内容会被预处理器复制到程序中。用#include包含文件时,相当于头文件中的文本将成为我们编写的文件的一部分。如果在头文件中放置了using声明,就相当于在包含该头文件的每个程序中都放置了同一using声明,不论该程序是否需要using声明。

通常,头文件中应该只定义确实必要的东西。请养成这个好习惯。

2、string IO操作getline接受两个参数:一个输入流对象和一个string对象。

while(getline(cin, line))

string类类型和许多其他库类型都定义了一些配套类型。通过这些配套类型,库类型的使用就能与机器无关。size_type就是这些配套类型中的一种。它定义为与unsigned型(unsigned int或unsigned long)具有相同的含义,而且可以保证足够大能够存储任意string对象的长度。为了使用由string类型定义的size_type类型,程序员必须加上作用域操作符来说明所使用的size_type类型是由string类定义的。

任何存储string的size操作结果的变量必须为string::size_type类型。特别重要的是,不要把size的返回值赋给一个int变量。string自己负责size_type一定能容纳的最大长度,且unsigned型所能表示的最大正数值比对应的signed型要大一倍。

3、C标准库头文件命名形式为name.h,而C++版本则命名为cname,少了后缀.h而在头文件名前加了c。c表示这个头文件源自C标准库。因此,cctype与ctype.h文件的内容是一样的,只是采用了更适合C++程序的形式。特别地,cname头文件中定义的名字都定义在命名空间std内,而.h版本中的名字却不是这样。

4、vector不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。vector类型的每一种都指定了其保存元素的类型。因此vector<int>和vector<string>都是数据类型。

vector中的对象是没有命名的。就像string中的字符对象、数组中的对象。

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

由end操作返回的迭代器指向vector的“末端元素的下一个”。通常成为超出末端迭代器,表明它指向了一个不存在的元素。如果vector为空,begin返回的迭代器与end返回的迭代器相同。

每种容器类型还定义了一种名为const_iterator的类型,该类型只能用于读取容器内元素,但不能改变其值。使用const_iterator类型时,我们可以得到一个迭代器,它自身的值可以改变,但不能用来改变其所指向的元素的值。

不要把const_iterator对象与const的iterator对象混淆起来。声明一个const迭代器时,必须初始化迭代器。一旦被初始化后,就不能改变它的值。

5、类似于vector,bitset类是一种类模板;而与vector不一样的是bitset类型对象的区别仅在其长度而不在其类型。在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度值:

bitset<32> bitvec;