第三章 、标准库类型
3.1、命名空间的 using 声明
1、在头文件中必须总是使用完全限定的标准库名字。
3.2、标准库 string 类型
1、 字符串字面值与标准库string 类型不是同一类型,初始化 string 对象的方式有以下四种:
string s1; //默认构造器, s1 为空字符串
string s2(s1); //将 s2 初始化为 s1 的一个副本
string s3("Value"); //将 s3 初始化为一个字符串字面值副本
string s4(n,'c'); //将 s4 初始化为字符 'c' 的 n 个副本
2、 string类型的输入操作符规则:
(1)、读取并忽略开头所有的空白字符 ( 如空格、换行符、制表符 ) ;
(2) 、读取字符直至再次遇到空白字符,读取终止。
3、 getline读取整行文本: while(getline(cin,string)) ,不包括换行符。
4、 String对象的操作:
(1) 、s[n] 返回 s 中位置为 n 的字符,位置从 0 开始计数;
(2) 、s1==s2 比较两个字符串的内容 (这与 Java 不同 )
(3) 、empty() size()....
5、 string::size_type类型:
(1) 、string 类型和许多其他库类型都定义了一些配套类型,通过这些配套类型的使用,库类型的使用就能与机器无关;
(2) 、 成员函数size() 返回的是 size_type 类型 ;
(3) 、任何存储string 的 size 操作结果的变量必须为 string::size_type 类型, 不要把size 的返回结果赋给一个 int 变量 ;
(4) 、 for(string::size_type s = 0; s != string.size(), s++),用 size_type 类型作为其下标的类型 ( 下面介绍的 vector 也是如此 ) 。
6、 string关系操作符 ( 采用和字典排序相同的策略,大小写敏感 ) :
(1) 、如果两个string 对象长度不同,且短的 string 对象与长的 string 对象的前面部分相匹配,则短的 string 对象小于长的 string 对象;
(2) 、如果两个string 对象的字符不同,则比较第一个不匹配的字符。
3.3、标准库 vector 类型
1、 vector不是一种数据类型,而是一个类模板,可以用来定义任意多种数据类型。 Vector 类型的每一种都指定了其保存元素的类型。因此, vector<int> 和 vector<string> 都是数据类型。
2、 Vector对象的初始化方式:
(1) 、vector<T> v1; //vector 保存类型为 T 的对象, v1 为空
(2) 、vector<T> v2(v1); //v2 是 v1 的一个副本
(3) 、vector<T> v3(n,i); //v3 包含 n 个值为 i 的元素
(4) 、vector<T> v4(n); //v4 含有值初始化的元素的 n 个副本
3、 虽然可以对给定元素个数的vector 对象预先分配内存,但 更有效的方法是先初始化一个空的vector 对象,然后动态地增加元素 。
4、 Vector对象的操作与 string 的大体相同,只是多了 push_back(value) 的操作,该操作的作用是在末尾添加一个元素。其中 size 操作返回相应 vector 类定义的 size_type 的值, vector类型总是包括 vector 的元素类型 : vector<int>::size_type //正确 vector::size_type // 错误
5、 必须是已存在的元素才能用下标操作符进行索引 。通过下标操作进行赋值时,不会添加任何元素,即 下标操作不能用来添加元素 。
3.4、迭代器简介 (iterator ,其工作原理的介绍见第十一章 )
1、 每种容器类型都定义了自己的迭代器类型,如:vector<int>::iterator iter;
2、 每种容器都定义了begin 和 end 的函数, 用于返回迭代器 :
(1) 、由begin 返回的迭代器指向第一个元素;
(2) 、由end 返回的迭代器指向 末端元素的下一个 ,该迭代器并不指向容器中的任何实际元素,它只是起一个哨兵的作用,表示我们已处理完vector 中的所有元素;
(3) 、如果容器为空,则begin 和 end 返回的迭代器相同。
3、 迭代器的自增和解引用运算:vector<int>::iterator it=v.begin();
(1) 、解引用操作符(* 操作符 ) : *iterator 返回迭代器当前所指向的元素;
(2) 、自增运算与int 类型的自增运算一样: iterator++ 指向第二个元素;
(3) 、end 操作返回的迭代器不指向任何元素,故不能对它进行解引用或自增操作。
4、 迭代器应用的示例:
for(vector<int>::iterator it=v.begin();it!=v.end();it++)
*it = 0; //将元素都置为 0
5、 每种容器类型还定义了一种名为const_iterator 的类型,该类型只能用于读取容器内的元素值,不能改变其值。
6、 迭代器的算术操作:iterator+/-n; it1-it2
7、 任何改变vector 长度的操作都会使已存在的迭代器失效 。
3.5、标准库 bitset 类型
1、 bitset类是一种类模板, 在定义时要明确bitset 含有多少位 ,须在尖括号内给出它的长度值:bitset<32> bitset; 给出的长度值必须是常量表达式 。
2、 用string 对象初始化 bitset 对象: string对象和 bitset 对象之间是反转化的, string 对象最右边的字符用来初始化 bitset 对象的低阶位 ( 下标为 0 的位 ) 。
3、 Bitset对象的操作:
(1) 、b.any() //b 中是否存在置为 1 的二进制位
(2) 、b.none() //b 中不存在置为 1 的二进制位吗
(3) 、b.count() //b 中置为 1 的二进制位的个数
(4) 、b.size() //b 中二进制位的个数
(5) 、b[pos] // 访问 b 中在 pos 处的二进制位
(6) 、b.test(pos) //b 中在 pos 处的二进制位是否为 1
(7) 、b.set() // 把 b 中所有的二进制位置为 1
(8) 、b.reset() // 把 b 中所有的二进制位置为 0
(9) 、b.set(pos) // 把 b 中在 pos 处的二进制位置为 1
(10) 、b.reset(pos) // 把 b 中在 pos 处的二进制位置为 0
(11) 、b.flip() // 把 b 中所有的二进制位逐位取反
(12) 、b.flip(pos) // 把 b 中在 pos 处的二进制位取反
(13) 、b.to_ulong() // 返回一个 unsigned long 值
4、 bitset 中的 size 和 count 操作的返回值类型为 size_t 。
(未完待续)