第三章 标准库类型
除基本类型外,C++还定义了一个内容丰富的抽象类型标准库,其中最重要的标准库类型是 string 和 vector,它们分别定义了大小可变的 字符串 和 集合,迭代器 作为配套类型,用于访问 string 中的字符和 vector 中的元素,标准库类型 bitset,提供了一种抽象方法来操作位的集合,通过这个类可以把某个值当作位的集合;标准库定义了许多高级抽象数据类型,我们在使用时不必关心它们如何表示,只需知道这些 抽象数据类型支持哪些操作 就可以了
3.1 命名空间的using 声明
:: 操作符是作用域操作符,它的含义是右操作数的名字可以在左操作数的作用域中找到,using 声明,可以在不需要加前缀 namspace_name:: 的情况下访问命名空间中的名字,如,using std::string,之后就不需要加std::前缀直接使用string,要用到的每一个名字都要提供一个using 声明,一旦使用了using 声明,我们可以直接引用名字,而不需要再引用该名字的命名空间,一个using声明一次只能 作用于一个命名空间成员
3.2标准库string类型
string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作
3.2.1 string对象的定义和初始化
string标准库支持几个 构造函数,没有明确指定对象初始化时,系统将使用默认构造函数,字符串字面值与标准库string类型不是同一种类型
3.2.2 string对象的读写
使用标准输入输出操作符来读写string 对象,string类型的输入操作符 >>:读取并忽略开头所有的空白符(如空格,换行符,制表符),读取字符直至再次遇到空白符,读取终止,输入符返回左操作数 istream对象 作为运算结果,读入未知数目的string对象,可以把输入操作作为判断条件(未到文件尾且未遇到无效输入),在<string>中的 getline读取整行文本,istream& getline (istream& is, string& str);,这个函数接受两个参数:一个输入流对象和一个string对象,从输入流的下一行读取,并保存读取的内容到string中,但不包括换行符,并 不忽略行开头的换行符,只要 遇到换行符,即便它是输入的第一个字符,getline也将停止读入并返回,getline函数 将istream参数作为返回值,和输入操作符一样也把它用作判断条件,getline函数返回时丢弃换行符,换行符将不会存储在string对象中,若要逐行输出需要自行添加
3.2.3 string对象的操作
string对象的 长度 指的是 string对象中字符的个数,可以通过size操作获得,任何存储string的size操作结果的变量必须为 string::size_type 类型,特别重要的是,不要把size的返回值赋给一个int变量,string::size_type与unsigned型具有相同的含义,string对象比较操作是区分大小写的,两个string对象相等是指它们的长度相等,且含有相同的字符,关系操作符比较两个string对象时采用了和字典排序相同的策略,string对象的加法被定义为连接,string对象可以和字符串字面值混合连接,+操作符的左右操作数必须至少有一个是string类型的,string 类型通过下标操作符来访问对象中的单个字符,下标操作符需要取一个size_type类型的值,来标明要访问字符的位置,string对象的下标从0开始,如果s是一个string对象且 不空 ,则 s[0] 就是字符串的第一个字符,s[s.size()-1 ]则表示s的最后一个字符,下标操作可用于左值,索引的下标越界是没有定义的
3.2.4 string对象中字符的处理
C标准库 的 字符操作函数,适用于string对象的字符(或其他任何char值),这些函数都 在cctype头文件中定义,C++标准库除了定义了一些特定于C++的设施外,还包括C标准库,isalnum(c),isalpha(c),iscntrl(c),isdigit(c),isgraph(c),islower(c),isprint(c),ispunct(c),isspace(c),isupper(c),isxdigit(c),tolower(c),toupper()
3.3标准库 vector类型
vector 是 同一种类型的对象的集合,每个对象都有一个对应的整数索引值,我们把vector称为容器,因为它可以包含其他对象,一个容器中的所有对象都必须是同一个类型的,说明vector保存 何种对象的类型,通过将类型放在类模板名称后面的 尖括号中 来指定类型
vector 不是一种数据类型,是一个模板,可用来定义任意多种数据类型
3.3.1 vector对象的定义和初始化
vector类定义了好几种构造函数,用来定义和初始化vector对象,vector对象的重要属性,在于可以在运行时高效地添加元素,先初始化一个空的vector对象,然后动态地增加元素
3.3.2 vector对象的操作
vector操作:
push_back()操作接受一个元素值,并将它作为一个新的元素添加到vector对象的后面,vector中的对象是没有命名的,可以按vector中对象的位置来访问它们,vector下标操作的结果是左值,下标操作不添加元素,必须是 已存在的元素 才能用下标操作符进行索引,通过下标操作进行赋值,不会添加任何元素,对取不存在的元素的结果标准没有定义
3.4迭代器
迭代器是一种 检查容器内元素并遍历元素的 数据类型,每种标准库容器类型都定义了一个名为iterator的成员,只有少数的容器支持下标操作,现代C++程序更倾向于使用迭代器而不是下标操作
每种容器都定义了一对命名为begin和end的函数,用于返回迭代器,end操作返回的迭代器指向vector的末端元素的下一个,如果vector为空,begin返回的迭代器与end返回的迭代器相同,如果容器不为空,begin返回迭代器指向第一个元素,迭代器类型可使用解引用操作符来访问迭代器所指向的元素,由于end操作返回的迭代器不指向任何元素,因此不能对它进行解引用或自增操作
任何改变vector长度的操作,都会使已存在的迭代器失效
vector 遍历(下标、迭代器):
#include <iostream> #include <vector> using namespace std; int main() { vector<int> v; v.push_back(99); v.push_back(100); v.push_back(88); v[1] = 111; //使用下标遍历 for(vector<int>::size_type ix=0; ix < v.size(); ix++)//size_type 无符号整型的别称 { cout << v[ix] << ","; } cout << endl; //使用迭代器遍历 for( vector<int>::iterator ite = v.begin(); ite !=v.end();ite++) { cout << *ite << ","; } return 0; }
每种容器类型还定义了一种名为 const_iterator的类型,该类型只能用于读取容器内元素,但不能改变其值,使用const_iterator类型时,我们可以得到一个迭代器,它自身的值可以改变,但不能用来改变其所指向的元素的值,可以对迭代器进行自增以及使用解引用操作符来读取值,但不能对该元素赋值,const_iterator对象与 const 的 iterator 对象不同,const 迭代器这种类型几乎没什么用处:一旦它被初始化,只能用它来改写其指向的元素,但不能使它指向任何其他元素
3.5标准库 bitset类型
标准库提供的bitset类简化了位集的处理
3.5.1 bitset对象的定义和初始化
bitset类是一种类模板,bitset类型对象 的区别 仅在其长度而不在其类型,在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度,给出的长度值必须是常量表达式,长度值必须定义为整形字面值常量 或是 已用常量值初始化的整形的const 对象,位集合的位置编号从0开始
当用unsigned long值作为 bitset对象的初始值时,该值将转化为二进制的位模式,而bitset对象中的位集作为这种模式的副本;当用string对象初始化bitset对象时,string对象直接表示为位模式,从string对象读入位集的顺序是从右向左,string对象和bitset对象之间是反向转化的:string对象的最右边字符即下标最大的那个字符用来初始化bitset对象的低阶位即下标为0的位,不一定要把整个string对象都作为bitset对象的初始值,可以只用某个子串作为初始值
3.5.2 bitset对象上的操作
bitset操作,用来 测试或设置bitset对象中的单个或多个二进制位
测试整个bitset对象:如果bitset对象中一个或几个二进制位位1,则 any操作 返回true,count操作 返回值为1的二进制位的个数(返回值类型size_t)
访问bitset对象中的位:用下标操作符 读 或 写每个索引位置的二进制位,还可以用 set、test和reset操作 来测试或设置给定二进制的值
对整个bitset对象进行设置:set 和 reset 操作 分别用来对整个bitset对象的所有二进制位全置1和全置0,flip操作 可以对bitset对象的所有位或个别位取反
获取bitset对象的值:to_ulong操作 返回一个unsigned long 值,该值与bitset对象的位模式存储值相同
输出二进制位:可以用 输出操作符 输出bitset对象中的位模式
使用位操作符:bitset类支持内置的位操作符