C++ Primer 第三章 标准库类型 标准库类型是我之前没有接触过内容,不仅是这一章,整本书有很多东西对我来说都是新的,谭伯伯那本介绍的东西只是C++中的皮毛罢了。感觉到学习C++将是个无底洞。学到什么程度才算高深,我现在心里没数,只能硬着头皮,踏着那倔强的神经学下去。
第2章所涉及的类型都是低级数据类型:这些类型表示数值或字符的抽象,并根据器具体机器表示来定义。 本章介绍两种最重要的标准库类型string和vector。string类型支持长度可变的字符串,vetor可用于保存一组指定类型的对象。 3.1 命名空间的using声明 前面看到过std::cin这样的读取数据操作,如果每次读取数据时都这么写代码会感觉非常麻烦和不简洁,现在介绍一种最安全的机制:using声明。 -使用using声明,我们可以直接引用名字,而不需要在引用改名字的命名空间。 如: using std::cin; -每个名字都需要一个using声明 如以下代码: #include<iostream> using std::cin; using std::cout; using std::endl; int main() { cout<< “Enter two number:”<<endl; int v1,v2; cin>>v1>>v2; cout<< “The sum of”<<v1 <<“ and”<<v2 << “is”<<v1+v2<<endl; return 0; } -对cin,cout和endl进行using声明,就意味着以后可以省去前缀std::,直接使用命名空间中的名字,这样代码可以更易读。
3.2 标准库string类型 摘要: string类型的输入操作符: Ø 读取并忽略开头所有空白字符 Ø 读取字符直至再次遇到空白字符,读取终止。 用getline读取整行文本: -这个函数接受两个参数:一个输入流对象和一个string对象 -与输入操作符不一样:不忽略行开头发换行符。 关于string对象的操作 size和empty操作 可以用size操作获取string对象的长度(字符的个数) 如:对象s,调用size函数:s.size(); 也可以用来判断string对象是否为空: if(s.size()==0) 判断string对象是否为空第二种方法就是用empty操作 if(s.empty()) empty()成员函数将返回bool值,string对象为空则返回true,否则返回false。 string::size_type类型 -size操作返回的是string::size_type类型的值 它定义为与unsigned型具有相同含义,并且可以保证足够大能够存储任意string对象的长度。 从string对象获取字符 -下标操作符需要一个size_type类型的值,来标明要访问字符的位置。 -string对象的下标从0开始,对象s的最后一个字符表示为s[s.size()-1] 可以用下标操作符分别取出string对象的每个字符,分别输出: string str(“some string”); for(string::size_typeix=0;ix!=str.size();++ix) cout<<str[ix]<<endl; -下标操作可用作左值 for(string::size_typeix=0;ix!=str.size();++ix) str[ix]=’*’; string对象中字符的处理都在cctype头文件定义。
标准库vector类型 -vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。 -vector被称为容器,是因为它可以包含其他对象,一个容器中的所有对象都必须是同一种类型的。 -vector是一个类模板,使用模板可以编写一个类定义或函数定义,而用于多个不同的数据类型。 -和其他变量一样,定义vector对象要指定和一个变量列表。 具体如下: vector<int> ivec; //该类型即是含有若干int类型对象,变量名为ivec vector对象的定义和初始化 - vector对象的定义和初始化 下面介绍几种初始化vector对象的方式 vector<T>v1; //默认构造函数,v1为空 vector<T>v2(v1); //v2是v1的一个副本 vector<T>v3(n,i); //v3包含n个值为i的元素 vector<T>v4(n); //v4含有初始化的元素的n个元素 vector对象的操作 -vector标准库提供了许多类似string对象的操作 -如对size和empty的操作跟string类型一样的 向vector添加元素 用以下代码来说明: string word; vector<string>text; while(cin>>word){ text.push_back(word); } -上述代码中text.push_back(word)是vector对象text引用push_bacd()函数,这个操作的作用是为vector添加元素,添加到vector对象的后面。 vector的下标操作 跟string类型类似,用size_type类型作为vector下标类型: for(vector<int>::size_typeix=0;ix!=str.size();++ix) ivec[ix]=0; -警告:下标操作不添加元素,仅能对确定存在的元素进行下标操作。
3.4 迭代器简介 -迭代器是一种检查容器内元素并遍历元素的数据类型 -它可以代替下标操作来访问元素,并且比下标操作跟通用,所有标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。 容器的iterator类型 如vector: vector<int>::iteratoriter;//定义名为iter的变量,它的数据类型是由vector<int>定义的iterator类型。 关于术语:迭代器和迭代器类型 -重要理解:若一种类型支持一组确定的操作(这些操作可用来遍历容器内的元素,并访问这些元素的值),我们就称这种类型为迭代器。 begin和end操作 -这两个操作用来返回迭代器 vector<int>::iteratoriter=ivec.begin(); -用begin操作返回迭代器指向的第一个元素,end操作来返回迭代器指向的最后一个元素的下一个元素(称为超出末端迭代器) const_iterator -每种容器类型还定义const_iterator的类型,该类型只能用于读取容器内的元素,但不能改变其值。 -当对const_iterator类型进行解引用(*),返回的是一个const值,不允许用const_iterator进行赋值。 -使用const_iterator类型时,它自身的值可以改变,但不能用来改变其所指向的元素的值。 -可以对迭代器进行自增以及使用解引用操作符来读值,但不能对该元素值赋值。 -注意:不要把const_iterator对象与const的iterator对象混淆。 -const迭代器几乎没什么作用,因为一旦它初始化,只能用它来改写其指向的元素,而不能使它指向任何元素。
3.5标准库bitset类型 -提供bitset类型是用来处理二进制位的有序集的。 -bitset也是一种类模板,但与vector的区别仅在其长度而不在其类型。 -在定义bitset时,要明确bitset含有多少位,须在尖括号内给出长度值: bitset<32>bitvec; //bitvec被定义为含有32位的bitset对象 初始化bitset对象的方法 bitset<n>b; //对象b有n为位,每位为0 bitset<n> b(u); //b是unsignedlong型u的一个副本 bitset<n> b(s); //b是string对象s中含有位串的副本 bitset<n> b(s,pos,n);//b是s中从位置pos开始的n个位的副本 -当用unsigned long值作为bitset对象的初始值时,该值将转化为二进制的位模式。 十六进制值0xffff表示为二进制位就是十六个1和十六个0 //bitvec1 的长度小于初始化值 bitset<16>bitvec1(0xffff); //0~15位被设置为1 //bitvec2的长度和unsigned long相同 bitset<32>bitvec2(0xffff); //0~15位设置为1,1~31位设置为0 //bitset3的长度大于usigned long bitset<128>bitvec3(0xffff); //位32到127被初始化为0 当用string对象初始化bitset对象时,string对象直接表示为为模式。从string对象读入位集的顺序是从右向左: string strval(“1100”); bitset<32>bitvec4(strval); //bitvec4的位模式中第2和3位置为1,其余位置都为0. -注解:string对象和bitset对象之间是反向转化:string对象的最右边字符用来初始化bitset对象的低阶位。 bitset对象上的操作 -用来测试或设置bitset对象中的单个或多个二进制位。 -count操作的返回类型是标准库中命名为size_t的类型 -bitset的size操作返回bitset对象中二进制位的个数,返回值是size_t的类型 -具体操作内容易理解就不做太多摘录
总结:本章介绍了三种标准库类型,一个是string类型、vector类型和bitset类型,这三种类型有很多类似之处,我觉得只要理解了其中的一种类型的基本概念和具体操作,然后对三种类型进行联系,也许就不会混淆,这一章简单简介了容器和迭代器,我对它们有了一定的了解,C++发展的趋势就是不断人性化,学习以最简洁最易理解的方式来编写程序,不断简化程序,减少代码的编辑量,我想自己走的就是这样的方向
摘自:wwj的梦想之路 |