第三章标准库(迭代器,bitset类型)
一、迭代器:是一种检查容器内元素并遍历元素的数据类型
1、容器的iterator 类型。每种容器类型都定义了自己的迭代器类型,如vector:
Vector<int>::iterator iter ;这条语句定义了一个名为iter的变量,它的数据类型由vector<int > 定义的iterator 类型。(各容器类都定义了自己的iterator类型,用于访问容器内的元素。)
2、begin和end操作
如果容器中有元素begin 返回迭代器指向第一个元素:
vector<itn>::iterator iter = ivec.begin() ;如果容器不为空,iter指向元素为ivec[0]。
由end操作返回的迭代器指向vector的末端元素的下一个。常常称为超出末端迭代器,它指向一个不存在的元素。如果vector为空,begin返回的迭代器与end返回的迭代器相同。注意: end操作返回的迭代器不指向vector任何实际元素,它只是一个哨兵的作用,表示我们已处理完了vector中所有元素。
3、迭代器类型可以用解引用操作符(*)来访问迭代器所指向的元素: *iter 表示iter指向的元素,另外,++iter表示指向下一个元素。(类似C中的指针)
4、程序实例:
下标操作:
For(vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)
Ivec[ix] = 0 ;
迭代器:
For(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
*iter = 0;
上面两个操作都将ivec中的所有元素都赋值为0;
5、const_iterator
当使用const_iterator类型时,我们可以得到一个迭代器,它自身的值可以改变,但不能用来改变其所指向的元素的值。
如: vector<int> nums(10);
Vector<int>::const_iterator iter = nums.begin();
*iter = 5 ; (是错误的,不能改变所指向元素的值)
然而,当定义 const_vector<int>::iterator cit = nums.begin();
*cit = 1;(正确,可以改变指向元素的值)
++cit ; (错误,此时的cit不能自增)
总结:Vector<int>::const_iterator 不能改写所指向的元素的值
而const_vector<int>::iterator 不能改变自身的值,也就不能指向下一个元素
6、迭代器的算术操作
(1),iter + n ; iter – n ; 对迭代器对象加上或减去一个整型值,产生一个新的迭代器,其位置在iter所指向元素的前或者后n个元素的位置。注意:加上或者减去的值的类型应该是vector的size_type 或者difference_type类型
(2),iter1 – iter2 ; 计算两个迭代器对象的距离。Iter1 和iter2 必须指向同一个vector中的元素。
二、标准库bitset类型
1、定义bitset是,要明确bitset含有多少位: bitset<32> bitvec ;
2、构造函数:
Bitset<n> b; b有n位,每位都为0
Bitset<n> b(u); b是unsigned long 型 u的一个副本
Bitset<n> b(s); b是string对象s中含有的位串的副本
Bitset<n> b(s,pos,n); b是s中从位置pos 开始的n个位的副本
3、当用unsigned long值作为bitset对象的初始值时,该值将转化为二进制的位模式。
4、用string对象初始化bitset对象时,string对象直接表示为位模式。从string对象读入位集的顺序是从右向左: string strval(“1100”); bitset<32> bitvec4(strval);
此时bitvec4 的位模式中第二和第三的位置是1,其余的是0。
注意:string对象的最右边字符(即下标最大的那个字符)用来初始化bits对象的低阶位(下标为0的位)。
5、bitset 对象上的操作(见书本P90)用来测试或者设置bitset对象中的单个或多个二进制位。
-----------------------------------------------------------------------------------------------------------------------------------------------
接着昨天第三章的标准库的学习笔记,今天看完了迭代器,bitset类型 ,感觉string,vector,bitset三个标准库都是差不多的,有很多相似的地方,如:都有对对象初始化的构造函数;在对象上的操作。 对比记忆更能加深印象。 下午则看了第四章的数组和指针,数组和指针大部分是与C语言相通相类似的,但是指针部分则发现了一个大不同点:const限定符和指针的连用,笔记我也贴上来吧,如下:
-------------------------------------------------------------------------------------------------------------------------------------------------
6、指针和const 限定符
(1)指向const对象的指针: const double *cptr ; C++强制要偶去指向const对象的指针也必须具有const特性。(const限定了cptr指针所指向的对象类型,并非cptr本身)注意:此时不能使用void*指针保存const对象的地址,必须要用const void* 类型的指针;如果对象不是const 对象,但是仍然不能通过cptr指针来修改其值。但是可以通过直接给该对象赋值或利用其它普通指针来对对象赋值。
(2)const 指针:指针本身的值不能修改!
Int errNumb;
Int *const curErr = &errNumb;
此时的curErr 是const指针,意味着不能使它再指向其它对象了。此外,const指针也必须在定义时就初始化。
注意:此时要求curErr 不能改变自身值,但是当它指向的对象不为const时,则可以利用curErr指针来修改对象的值!
(3)指向const对象的const指针:上面两种指针的结合使用!
如:const double pi = 3.14; const double *const pi_ptr = &pi ;定义指针的语
中,第一个const 限制只能指向const对象,且不能改变对象的值;第二个const限制了指针自身不能修改。
7、指针和typedef
给出下列语句: typedef string *pstring;
Const pstring cstr ;问cstr的类型是什么?
声明const pstring 时,const修饰的是pstring 的类型,这是一个指针。因此,该语句是把cstr 定义为指向string类型对象的const指针,等价于 string *const cstr ;
其实,string const s1 和 const string s2 是等价的,s1和s2是同类型的,都是string 和const;
-------------------------------------------------------------------------------------------------------------------------------------------------
上面笔记都是最重要的部分,这是一个新知识,但是在有例子和对比学习的方式下,还是比较容易理解的。笔记中的几个注意是很重要的,一些细节的区分点都在这。