C++ 迭代器(Iterator) 1.1 定义 迭代器是一种检查容器内元素并遍历元素的数据类型。 迭代器是一个变量,提供对一个容器中的对象的(间接)访问方法,并且定义了容器中对象的范围。...迭代器可以指向容器中的某个元素,通过迭代器就可以对非数组(存储空间不连续)的数据结构进行遍历。 容器和string有迭代器类型同时拥有返回迭代器的成员。...反向迭代器和正向迭代器的区别在于: 对正向迭代器进行++操作时,迭代器会指向容器中的后一个元素; begin() -> end() 从前往后遍历 对反向迭代器进行++操作时,迭代器会指向容器中的前一个元素...输出迭代器只支持一遍算法,同一输出迭代器不能两次遍历一个序列 正向 组合输入迭代器和输出迭代器的功能,并保留在容器中的位置 双向 组合正向迭代器和逆向迭代器的功能,支持多遍算法 随机访问 组合双向迭代器的功能与直接访问容器中任何元素的功能...STL 迭代器失效的几种情况总结 C++容器类插入和删除时迭代器的失效情况总结 序列式(数组式) 容器 vector 迭代器失效 (1)erase() 和 insert() 会使当前位置到容器末尾元素的迭代器全部失效
文章目录 一、什么是反向迭代器 二、STL 源码中反向迭代器的实现 三、reverse_iterator 的模拟实现 四、vector 和 list 反向迭代器的实现 一、什么是反向迭代器 C++ 中一共有四种迭代器...---- 二、STL 源码中反向迭代器的实现 我们可以通过参考 STL 源码中反向迭代器的实现方式来学习如何实现反向迭代器,如下: //list.h部分源码 -- SGI版 template <class...vector 反向迭代器 反向迭代器相关代码: #include "iterator.h" template class list { //反向迭代器 typedef thj...T, class Ref, class Ptr> struct __list_iterator //迭代器类 { typedef list_node node; //重命名list节点...: namespace thj { template class vector { public: //正向迭代器 typedef T* iterator;
迭代器的概念 迭代器是用来访问string对象或vector对象的元素的,类似于下标运算和指针。...迭代器的使用 不同于指针,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员; 比如,这些类型拥有名为begin和end的成员,begin成员负责返回指向第一个元素(或第一个字符)的迭代器...如果迭代器为空,则begin和end返回的是同一个迭代器; 标准容器迭代器的运算符 ? 和指针类似,也能通过解引用迭代器来获取它所指向的元素,执行解引用的迭代器必须合法并确实指向着某个元素。...但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素; 迭代器运算 ?...迭代器的算术运算 可以令迭代器和一个整数值相加(或相减),其返回值是向前(或向后)移动了若干个位置的迭代器。
STL中vector迭代器失效常见错误写法示例 最近在看STL容器失效的例子,涉及到vector数组迭代器失效的问题,如果不注意使用,很容易出现问题,我们先来看一下一个简单的示例程序,在数组nums中删除大于...= nums.end();) { if (*iter > 50) { nums.erase(iter); // 此处在删除iter之后iter迭代器失效,再在后续的for循环中使用iter时会导致崩溃...= nums.end();) { if (*iter > 50) { //nums.erase(iter); // 此处在删除iter之后iter迭代器失效,再在后续的for循环中使用iter...这是因为vector数组在对某个iter迭代器执行erase操作之后会返回一个后向迭代器。...但是nums.erase(iter)会返回一个正确的后序迭代器,将其赋值给iter,再对iter进行操作就OK了。
迭代器可用于遍历ArrayList。如果ArrayList中有更多元素,则hasNext()方法返回true,否则返回false。...示例import java.util.ArrayList; import java.util.Iterator; public class Demo { public static void main...然后,使用一个使用Iterator接口的迭代器显示ArrayList元素。
原因是通过迭代器删除指定的元素时,指向那个元素的迭代器将失效,如果再次对失效的迭代器进行 ++ 操作,则会带来未定义行为,程序崩溃。...class CPPCollection { public: //迭代器类 class Iterator { public: int index;// 元素下标 CPPCollection&...由于C++中的内部嵌套类与外围的类没有联系,为了访问外部类对象的值,我们必须要传入一个引用(或指针,本例中传入引用)。Iterator的自增方法其实就是增加内部的一个索引值。判断!...=的方法是和另外一个迭代器做比较,这个迭代器一般是集合的末尾,当我们的索引值等于末尾的索引值end时,认为迭代器已经达到了末尾。...参考文献 编写高质量代码:改善C++程序的150个建议.李健.机械工业出版社.
因为反向迭代器与正向迭代器在功能上存在高度一致性,唯一的区别在于它们在容器中的移动方向相反。因此,我们可以采用适配器设计模式,对现有的正向迭代器进行二次封装,以此满足反向迭代器的需求。...2 反向迭代器 我们先来看源码中是如何实现的: template #else template <class RandomAccessIterator, class T, class Reference,...接下来我们也来实现一下自己的反向迭代器: 3 复刻反向迭代器 通过对反向迭代器的设计模式的了解,我们可以大致写一个框架: namespace bit { // 适配器 -- 复用 //给谁的正向迭代器就产生谁的正向迭代器...3.1 加减操作 根据反向迭代器的性质,我们可以借助正向迭代器的函数来实现反向迭代器的加减操作。
迭代器模式 ❝提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 ❞ C++ STL中各个容器都有迭代器的体现,通过迭代器能够顺序的访问该容器各成员。...因为现存的标准库都有提供各种容器List、Array等,都有提供迭代器遍历。这里只是简单分析这种模式的实现原理。 类图 迭代器模式类图 CIteratorBase: 迭代器基类。...注: 为了实现通用的迭代器,迭代器类使用了泛型编程的模板方法。...: 客户端代码,程序入口 Makefile: 编译工具 ---- 「迭代器实现」 template class CIterator : public CIteratorBase...可以实现新型的集合和迭代器并将其传递给现有代码, 无需修改现有代码。 可以并行遍历同一集合, 因为每个迭代器对象都包含其自身的遍历状态。 在C++ STL库中已经提供迭代器的实现。
clear()删除所有元素 empty()如果list是空的则返回true end()返回末尾的迭代器 erase()删除一个元素 front()返回第一个元素 get_allocator...()从list删除元素 remove_if()按指定条件删除元素 rend()指向list末尾的逆向迭代器 resize()改变list的大小 reverse()把list的元素倒转 size...end()返回指向容器最后一个元素的迭代器 最后,要介绍的是C++中map容器的基本用法,也就是很常见的key-value对容器。...clear(删除所有元素 count()返回指定元素出现的次数 empty()如果map为空则返回true end()返回指向map末尾的迭代器 equal_range()返回特殊条目的迭代器对...()返回键值>=给定元素的第一个位置 max_size()返回可以容纳的最大元素个数 rbegin()返回一个指向map尾部的逆向迭代器 rend()返回一个指向map头部的逆向迭代器 size
迭代器类型 就像不知道string或vector的size_type成员到底是什么类型一样,一般情况下我们也不知道(其实是无须知道)迭代器的精确类型。...拥有迭代器的标准库类型使用iterator和const_iterator来表示迭代器类型: // 可读写元素的迭代器 vector::iterator it1; string::iterator...// 令迭代器指向下一个元素 --iter // 令迭代器指向上一个元素 iter1 == iter2 // 如果两个迭代器指向同一个元素或者是同一个容器的尾后迭代器, 那么相等 iter1...// 迭代器加上(减去)一个整数仍得到一个迭代器, 指向的新位置与原来相比向前(向后)移动了n个位置, 结果迭代器指向容器内的一个元素或者尾后元素 iter + n iter - n iter +=...// 迭代器的关系运算符 >、>=、<、<= 注意事项 某些对vector对象的操作可能会使迭代器失效 注意push_back()操作会使得vector对象的迭代器失效,因此不要在范围for循环中向vector
原因是通过迭代器删除指定的元素时,指向那个元素的迭代器将失效,如果再次对失效的迭代器进行++操作,则会带来未定义行为,程序崩溃。...2.STL中容器的迭代器的底层实现机制 提到STL,必须要马上想到其主要的6个组成部件,分别是:容器、迭代器、算法、仿函数、适配器和空间分配器,迭代器是连接容器和算法的一种重要桥梁。...class CPPCollection { public: //迭代器类 class Iterator { public: int index;//元素下标...=的方法是和另外一个迭代器做比较,这个迭代器一般是集合的末尾,当我们的索引值等于末尾的索引值end时,认为迭代器已经达到了末尾。...---- 参考文献 [1]编写高质量代码:改善C++程序的150个建议.李健.机械工业出版社.
前言 反向迭代器的使用相信大家都已经比较熟悉了,那我们这篇文章具体讲什么呢? ,这篇文章我们重点来讲一下反向迭代器的模拟实现。 那为什么我们之前不和正向迭代器放在一块讲呢?...那现在大家思考一个问题:单从使用的角度来看,反向迭代器和正向迭代器有什么区别?...库里面反向迭代器的实现——迭代器适配器 ,我们来看一下库里面list的迭代器是如何实现的 我们看到,这里的反向迭代器包括const版本的,它们都是对reverse_iterator这个类模板的一个typedef...反向迭代器模拟实现的改进——适配器模式 接下来我们按照库里面的方式来实现一下: namespace yin { template struct Reverse_Iterator...但是对于适配器的实现方式: 你给我一个list的正向迭代器,我可以给你适配出list的反向迭代器,那如果给一个vector的正向迭代器,能否适配出vector的反向迭代器呢?
最后想了一下,是不是某个地方线程做了耗时或者同步阻塞操作导致的,或者线程中执行了死循环,排查后发现是因为一个同事在对map做循环遍历时,erase操作不当,导致某个地方迭代器失效,线程崩溃了,持有两把锁...map迭代器失效问题 下面来看一下错误的map迭代器失效写法,代码如下: #include #include #include #include...erase迭代器只是被删元素的迭代器失效,但是返回值为void, 所以要采用erase(iter++)的方式删除迭代器。..." << "\n"; } std::cout << std::endl; } int main() { mapTest(); return 0; } 运行结果如下图所示: 参考文章 【C+...+ STL】迭代器失效的几种情况总结 STL容器迭代器失效情况分析、总结 迭代器失效的几种情况总结
1.引入:list的反向迭代器 首先来回顾一下我们实现list的正向迭代器: template struct ListIterator...以下是如何定义一个ListIterator的反向版本的示例: template struct ReverseListIterator {...,我们下面来实现另一种适配模式,我传入某一容器的正向迭代器来适配生成反向迭代器 比如传入List类的正向迭代器,适配出List的反向迭代器,传入vector正向迭代器,适配出vector的反向迭代器 template...= 总结编译器处理: 本来每个容器都要写一个反向迭代器的累,但是自己写,太费劲了 本质写一个反向迭代器的类模板,给编译器传不同的容器的正向迭代器实例化,编译器帮助我们实例化出各种容器的对应反向迭代器...C++ 标准库中的 std::reverse_iterator 就是这样一个通用的反向迭代器适配器。
原因我想可能是const char*指向string对象,但是却不含member function,,后面用到的(*it).empty()的class type中需要用到member function,
---- 前言 适配器模式是 STL 中的重要组成部分,在上一篇文章中我们学习了 容器适配器 的相关知识,即 stack 与 queue,除了 容器适配器 外,还有 迭代器适配器,借助 迭代器适配器,可以轻松将各种容器中的普通迭代器转变为反向迭代器...可以用来反向遍历容器,在某些场景下很实用 反向迭代器类中需要有:正向迭代器对象、构造函数 template struct __reverse_iterator {...,为了解决普通对象与 const 对象的代码冗余问题,引入了多参数,通过对形参传递不同的对象,变换为不同属性的迭代器;在反向迭代器类中,这一种巧妙思想也得到了继承 template #include "reverse_iterator.hpp" //使用反向迭代器 using namespace std; //…… //list本类 template<class...vector(反向迭代器版) list(反向迭代器版) ---- 总结 以上就是本篇关于 C++ STL 学习之【反向迭代器】的全部内容了,在本篇文章中,我们主要学习了反向迭代器类的思想及实现,最后分别用了
而迭代器则是STL中的令一种重要的概念,它是一个抽象化的数据访问机制,通过迭代器可以遍历STL容器中的元素。...下面是具体用例,通过使用插入迭代器我们可以将一组数据插入到容器中的前或后等位置。...Reverse_iterator 是STL提供的一种用于反向迭代器的适配器。...一个reverse_iterator对象接受一个普通迭代器参数,并将该迭代器反转。如此一来,通过++运算符将使迭代器指向前一个元素,而*运算符返回的是它所指向的下一个元素。...= (const reverse_iterator& rhs) const; }; 下面是一个使用reverse_iterator的例子,该迭代器是一个用随机访问迭代器构造出来的迭代器,用于反向迭代容器元素
1、两个迭代器组成的区间是前闭后开的 2、如果迭代器的有效性,如果迭代器所指向的元素已经被删除,那么迭代器会失效 http://blog.csdn.net/hsujouchen/article/details.../8987233 3、迭代器指向的内容为空的时候(如已经指向end的时候)是不能访问值的,否则运行会崩溃(报错内容iterator not dereferencable) 1 string str_in...4、迭代器已经指向end的时候,不能继续++了,否则运行时候会崩溃(报错内容iterator not incremencable) 1 string str_in; 2 cin>>str_in
而迭代器则是STL中的令一种重要的概念,它是一个抽象化的数据访问机制,通过迭代器可以遍历STL容器中的元素。...下面是具体用例,通过使用插入迭代器我们可以将一组数据插入到容器中的前或后等位置。...Reverse_iterator 是STL提供的一种用于反向迭代器的适配器。...一个reverse_iterator对象接受一个普通迭代器参数,并将该迭代器反转。如此一来,通过++运算符将使迭代器指向前一个元素,而*运算符返回的是它所指向的下一个元素。...= (const reverse_iterator& rhs) const;};下面是一个使用reverse_iterator的例子,该迭代器是一个用随机访问迭代器构造出来的迭代器,用于反向迭代容器元素
ArrayList中的迭代器去遍历数据。...具体迭代器角色(ConcreteIterator): 实现【抽象迭代器角色】定义的执行操作 记录集合迭代时的当前位置,如图中的currentItem()方法 当客户端控制迭代,迭代器被称作外部迭代器;当迭代器控制迭代...,迭代器是内部迭代器。...): 实现【抽象集合角色】,实现创建迭代器对象方法,返回一个迭代器实例 代码示例 家有小女,名为晓月,一岁有余,嘤嘤学语。...2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
领取专属 10元无门槛券
手把手带您无忧上云