C++Primer3.4节迭代器知识点梳理

C++Primer3.4节迭代器知识点梳理

1、迭代器的含义:
(1)可能是迭代器概念本身
(2)可能是容器定义的迭代器类型
(3)可能是指某个迭代器对象。

2、迭代器的作用:
(1)迭代器类似于指针类型,可以使用迭代器来间接访问string对象的字符和vector对象的元素。
(2)迭代器也能从一个元素移动到另外一个元素。

3、迭代器的对象:是vector对象中的某个元素的地址或者string对象的某个字符的地址。

4、迭代器的类型:
(1)一般来说,我们并不清楚也不在意迭代器的类型是什么;
(2)但实际上,拥有迭代器的标准库类型使用(用容器定义的)iterator和const_iterator来表示迭代器的类型。
(3)语法形式:vector< int >iterator it; 或vector< string >const_iterator it;。
(4)iterator的对象可读可写,const_iterator的对象可读不可写。

5、迭代器的获取方法;
(1)因为string和vector等其他容器类型都有begin和end成员,因为我们不知道迭代器的具体类型,我们可以使用auto类型来定义迭代器的对象。
(2)begin成员:负责返回指向第一个元素的迭代器。end成员:负责返回指向容器(或string对象)尾元素的下一位置的迭代器。end成员返回的迭代器被称为尾后迭代器。
(3)语法形式:string str{“i am a good man!”}; auto a=str.begin(),auto b=str.end();
(4)特殊情况下,如果容器(或string对象)为空,则begin和end返回的是同一个迭代器,都是尾后迭代器。

6、迭代器运算符
(1)==和!=用来比较两个合法的迭代器是否相等。
(2)*iter //返回迭代器所指元素的引用。
(3)iter->men等价于(*iter).men。 //解引用iter并获取该元素的成员men。
(4)++iter; //指向该元素的下一个位置,从一个元素移动到另外一个元素。
(5)- -iter; //指向该元素的上一个位置。
(6)begin和end()运算符,begin和end返回的类型由容器的对象的是否是常量决定。若vector对象的类型是常量,那么返回的就是const_iterator;若非常量,那么返回的就是iterator。形如:
vector< int > vec;//非常量对象; const vector< int > vec; //常量对象
(7)为了便于得到const_iterator类型的返回值,引入了两个新函数,分别是cbegin和cend函数。无论vector对象是否是常量,两个函数的返回的类型都是const_iterator。
(8)注意事项:
a、不能在范围for循环中向vector对象添加元素。
b、任何一种可能改变vector对象容量的操作,都会使vector对象的迭代器失效,所以不允许往使用了迭代器的容器对象添加元素。

7、迭代器的运算
(1)iter+n;或liter-n;可以令迭代器相加(或相减),其返回值是向前(或向后)移动了若干位置的迭代器。
(2)两个迭代器的相减:前提是两个迭代器指向的是同一个容器中的元素或尾元素的下一位置,就能相减,得到的结果是两个迭代器的距离,距离的类型是difference_type的带符号整数,可正可负。

8、使用迭代器的经典算法——二分法。
C++PrimerP100页中的二分法的例子中有错误,错误在if(sought<*mid)下面的这条语句,只将mid值重新赋给end,却没有给mid重新赋值,导致while循环判断mid==end,直接停止循环。

猜你喜欢

转载自blog.csdn.net/qq_47466050/article/details/106546776