c++primer学习笔记-----3.4迭代器介绍

    xiaoxiao2021-04-12  29

    我们已经知道可以使用下标运算符来访问string 对象的字符或vector 对象的元素,还有另外一种更通用的机制也可以实现同样的目的,这就是迭代器。

    在第二部分中将要介绍,除了vector 以外,标准库还定义了其他几种容器。所有标准库容器都可以使用迭代器,但是只有少数几种才同时支持下标运算符。(严格来讲,string 对象不属于容器,但是string 对象支持很多与容器类型类似地操作)

    迭代器在使用中类似指针类型,也提供了对对象的间接访问。

    迭代器有有效和无效之分:有效的迭代器或者指向某个元素,或者指向容器中尾元素的下一位置;其余情况均属无效。

    3.4.1 使用迭代器

    【和指针不一样的是,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员函数。

    通常来说,我们并不在意迭代器准确的类型是什么,在实际使用中,利用auto 关键字基本足够。

    如,这些类型都拥有名为begin 和end 的成员,其中begin 返回指向第一个元素的迭代器,end 返回指向容器“尾元素的下一位置”的迭代器。 

    end 成员返回的迭代器通常称作”尾后迭代器”,或简称为尾迭代器,这样的迭代器没有实际意义,通常作为标记使用。

    如果容器为空,begin 和end 返回的是同一个迭代器。】

    【迭代器支持的运算符运算:

    *iter iter->mem // 解引用iter 并获取该元素的名为mem 的成员,等价于(*iter).mem{括号不能省略,省略后会将iter.mem 看做一体},使用箭头运算符可避免这一问题 ++iter --iter iter1 == iter2 iter1 != iter2和指针类似, 也能通过解引用迭代器来获取它所指示的元素,但要求该迭代器必须合法并确实指向某个元素(尾后迭代器和无效迭代器无法解引用)。

    从逻辑上说,迭代器的递增递减与整数类似,不过不是在值上加减,而是将迭代器“向前或向后移动一个位置”。(指针的递增递减同理)

    当迭代器被用进条件表达式时,尽量使用“==”或“!=”而非(<, >, <=, >=),因为标准库类型的迭代器都支持前者,却并不都支持后者,所以养成在迭代器中使用前者的习惯。】

    【实际上,使用iterator 和const_iterator 来表示迭代器的类型:

    vector<int>::iterator iter1; vector<string>::const_iterator iter2; 其中const_iterator 和指向常量的指针相似,能读取但不能修改它指向的元素的值,是底层常量而非顶层常量,常量对象只能用const_iterator,非常量两者都可使用。 begin 和end 的返回值由对象是否为常量决定,如果对象是常量,返回const_iterator,否则返回iterator。

    当明确我们的操作只需读取无须写入的话,最好使用常量类型,此时可用c++11 新标准引入的cbegin 和cend,无论对象是否为常量,这两个函数的返回值一定是const_iterator。】

    【vector 对象能动态增长的特性导致一些使用上的限制,如:任何一种可能改变vector 对象容量的操作(push_back),都会使该vector 对象的迭代器失效。(9.3.6节是否改变vector 对象的容量使其整体在内存中的位置也发生了改变)】

    3.4.2 迭代器运算

    【比起标准库的其他容器, vector 和string 的迭代器提供了更多额外的运算符,可以使迭代器每次移动跨过多个元素或进行关系运算: iter + n // 迭代器加上一个整数值仍是迭代器,相比原位置向前移动了n 个元素 iter - n // 同上 iter += n iter -= n iter1 - iter2 // 两个迭代器相减的结果是它们之间的距离,参与运算的两个迭代器必须指向的是同一个容器中的有效位置(元素位置或尾后位置) >, <, <=, >= // 比较两个迭代器的位置,称靠前者小于靠后者,参与运算的两个迭代器必须...同上两个迭代器相减,在运算有效的情况下,返回值是difference_type 的带符号整形数。】
    转载请注明原文地址: https://ju.6miu.com/read-667536.html

    最新回复(0)