第三章标准库(迭代器,bitset类型)

第三章标准库(迭代器,bitset类型)

一、迭代器:是一种检查容器内元素并遍历元素的数据类型

1、容器的iterator 类型。每种容器类型都定义了自己的迭代器类型,如vector

Vector<int>::iterator  iter ;这条语句定义了一个名为iter的变量,它的数据类型由vector<int > 定义的iterator 类型。(各容器类都定义了自己的iterator类型,用于访问容器内的元素。)

2beginend操作

       如果容器中有元素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

5const_iterator

       当使用const_iterator类型时,我们可以得到一个迭代器,它自身的值可以改变,但不能用来改变其所指向的元素的值。

       如:  vector<int>  nums10);

                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个元素的位置。注意:加上或者减去的值的类型应该是vectorsize_type 或者difference_type类型

       2),iter1 – iter2    计算两个迭代器对象的距离。Iter1 iter2 必须指向同一个vector中的元素。

二、标准库bitset类型

1、定义bitset是,要明确bitset含有多少位: bitset<32> bitvec

2、构造函数:

       Bitset<n>  b;                    bn位,每位都为0   

       Bitset<n>  b(u);               bunsigned long u的一个副本 

       Bitset<n>  b(s);                bstring对象s中含有的位串的副本   

       Bitset<n>  b(s,pos,n);      bs中从位置pos 开始的n个位的副本

3、当用unsigned long值作为bitset对象的初始值时,该值将转化为二进制的位模式。

4、用string对象初始化bitset对象时,string对象直接表示为位模式。从string对象读入位集的顺序是从右向左: string strval(“1100”); bitset<32> bitvec4(strval);

此时bitvec4 的位模式中第二和第三的位置是1,其余的是0

注意:string对象的最右边字符(即下标最大的那个字符)用来初始化bits对象的低阶位(下标为0的位)。

5bitset 对象上的操作(见书本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指针来修改其值。但是可以通过直接给该对象赋值或利用其它普通指针来对对象赋值。

2const 指针:指针本身的值不能修改!

         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 是等价的,s1s2是同类型的,都是string const

-------------------------------------------------------------------------------------------------------------------------------------------------

上面笔记都是最重要的部分,这是一个新知识,但是在有例子和对比学习的方式下,还是比较容易理解的。笔记中的几个注意是很重要的,一些细节的区分点都在这。

 

posted @ 2012-07-11 22:53  欢_全力以赴  阅读(556)  评论(0编辑  收藏  举报