一、迭代器适配器 反向迭代器 插入迭代器 IO流迭代器 其中反向迭代器可以参考以前的文章。...二、插入迭代器 插入迭代器实际上是一个输出迭代器(*it=; ++) back_insert_iterator back_inserter front_insert_iterator... to container }; 类内部的成员container 保存的是指向容器的指针,重载了*, ++, = 等运算符,* 和 ++ 返回的都是迭代器本身,主要看 赋值运算符: container-...当然了,与back 配对的就是front,back 是末尾插入,front 是头端插入,需要注意的是front_insert_iterator 的operator= 调用了 push_front 函数,...输出流迭代器(ostream_iterator) *it=; ++ 输入流迭代器(istream_iterator) =*it; ->; ++; ==; !
1.2 vector迭代器 在1.1给出的源码摘录中可以看到以下几行: typedef _Tp value_type; typedef typename _Base::pointer...的迭代器就是普通的指针,在实际使用时如果我们定义一个保存了整型数据的vector迭代器,实际上就是一个整型指针,如: vector::iterator it; //迭代器 int *it;...//上面d额迭代器可以等价成此形式。...pointer _M_end_of_storage; //指向剩余空间的尾 }; 使用这三个指针可以方便获取vector中头、尾元素以及对容器进行运算。...__args) { return _M_emplace_aux(__position, std::forward(__args)...); } insert,插入元素,使用右值表达式,通过
,需重新分配/复制数据/释放原始空间;不过deque的迭代器设置比vector复杂,因为迭代器不能使用普通指针,因此尽量使用vector。...在上图中,buffer称为缓冲区,显示map size的一段连续空间就是中控器。 中控器包含了map size,指向buffer的指针,deque的开始迭代器与结尾迭代器。...例如现在迭代器执行++操作,当前buffer不够用了,那么此时需要一个指针能够回到中控器,取下一段buffer,重置_M_first与_M_last的指针位置,_M_cur指向新段buffer中的指定位置...而vector使用的迭代器也是这个,根据侯捷老师所讲,连续的buffer是vector,这与迭代器的tag类型不谋而合。 下面来看一下这个强大的迭代器的一些操作符重载: 具体的讲解在代码里面说。...★insert()函数 ” insert函数比较有意思,根据传递进来的迭代器位置,看是不在开头与结尾,如果是在开头直接调用push_front函数,结尾直接调push_back函数,否则在容器中直接插入元素
一、迭代器 迭代器是泛型指针 普通指针可以指向内存中的一个地址 迭代器可以指向容器中的一个位置 STL的每一个容器类模版中,都定义了一组对应的迭代器类。...上面介绍的是vector::iterator ,比如 list::iterator 实现是类似的,内部成员也是一个指针,不过是指向Node 结点的指针,如: _Nodeptr _Ptr;// pointer...map, set, list类型提供双向迭代器,而string, vector和deque容器上定义的迭代器都是随机访问迭代器,用作访问内置数组元素的指针也是随机访问迭代器。...2、对于顺序式容器(vector)元素的删除、插入操作会导致指向该元素以及后面的元素的迭代器失效。...众所周之当使用一个容器的insert或者erase函数通过迭代器插入或删除元素"可能"会导致迭代器失效,因此建议我们获取insert或者erase返回的迭代器,以便用重新获取新的有效的迭代器进行正确的操作
还有v. insert(pointer, content),v.insert(pointer,a[2],a[4])将a[2]到a[4]三个元素插入。...这个简单介绍表示了仅仅要有元素须要插入并且容器的容量不足时就会发生又一次分配(包含它们维护的原始内存分配和回收,对象的拷贝和析构和迭代器、指针和引用的失效)。...在大小和容量之间的关系让我们能够预言什么时候插入将引起vector或string运行又一次分配,并且,能够预言什么时候插入会使指向容器中的迭代器、指针和引用失效。...假设不是运行push_back,代码在string的任何位置进行一个insert,我们仍然能够保证在插入期间没有发生又一次分配,可是,与伴随string插入时迭代器失效的一般规则一致,全部从插入位置到string...结尾的迭代器/指针/引用将失效。
还有v. insert(pointer, content),v.insert(pointer,a[2],a[4])将a[2]到a[4]三个元素插入。...这个简介表示了只要有元素需要插入而且容器的容量不足时就会发生重新分配(包括它们维护的原始内存分配和回收,对象的拷贝和析构和迭代器、指针和引用的失效)。...在大小和容量之间的关系让我们可以预言什么时候插入将引起vector或string执行重新分配,而且,可以预言什么时候插入会使指向容器中的迭代器、指针和引用失效。...如果不是执行push_back,代码在string的任意位置进行一个insert,我们仍然可以保证在插入期间没有发生重新分配,但是,与伴随string插入时迭代器失效的一般规则一致,所有从插入位置到string...结尾的迭代器/指针/引用将失效。
中使用了两种迭代器,分别是正向__normal_iterator与反向迭代器reverse_iterator: 正向: typedef __gnu_cxx::__normal_iterator <pointer...const _Iterator& base() const _GLIBCXX_NOEXCEPT { return _M_current; } }; _M_current 是指向迭代器位置的指针...2.2 反向 vector 还会使用 reverse_iterator,即逆序迭代器,顾名思义,其移动方向与普通迭代器相反 template class reverse_iterator...第二次 swap 获得__last的指针对应的迭代器。...使用两个迭代器范围内的值初始化,除了stl的迭代器,也可以是数组地址 template<typename _InputIterator, typename = std::_RequireInputIter
也因此,deque没有必要提供所谓的空间保留(reserve)功能 deque的迭代器:虽然deque也提供 Ramdon Access Iterator,但它的迭代器并不是原生指标,其复杂度和 vector...first:迭代器当前所指的缓冲区区间的头 last:迭代器当前所指的缓冲区区间的尾 node:指向deque管控器中的一个指针。...用来指针当前迭代器所指的缓冲区归管控器中的哪一个指针所管理 buffer_size()函数:绝对缓冲区大小的函数,调用__deque_buf_size()全局函数(见下面介绍) template <class...如果有新元素要插入于尾端,可直接拿此备用空间来使用 ? 迭代器其他函数(附set_node函数) 下面是deque迭代器的几个关键行为。...()函数 insert提供了许多版本,最基础最重要的是以下的版本,允许在某个点(之前)插入一个元素,并设定其值 // 在 position 处插入一个元素,其值为 x iterator insert(iterator
,额外内存开销大 设计目的:令容器在任何位置进行插入和删除都很快 何时使用: 容器需要不断地在中间插入或删除元素 无论删除还是增加,list的迭代器、引用、指针都不会失效 与其他容器的比较: vector...三、list的迭代器 list不再能够 vector一样以原生指标做为迭代器,因为其节点不保证在储存空间中连续存在 list迭代器必须有能力指向list的节点,并有能力做正确的递增、递减、取值、成员存取等动作...这在vector是不成立的,因为 vector的插入动作可能造成记忆体重新配置,导致原有的迭代器全部失效 甚至list的元素删除动作(erase),也只有“指向被删除元素”的那个迭代器失效,其他迭代器不受任何影响...首先配置并构造一个节点,然后在尾端进行适当的指针动作,将新节点插入进去: //函数目的:在迭代器 position 所指位置插入一个节点,内容为x iterator insert(iterator position...由于list不像vector 那样有可能在空间不足时做重新配置、数据移动的操作,所以插入前的所有迭代器在插入动作之后都仍然有效 ?
Front_insert_iterator 和 Back_insert_iterator 是两种STL提供的迭代器适配器,主要用于实现容器的插入操作。...这两种适配器都是在使用中间层的帮助下实现容器的插入操作,其主要作用是在输出迭代器(通常是一个容器)的末尾自动添加新的元素。...下面是具体用例,通过使用插入迭代器我们可以将一组数据插入到容器中的前或后等位置。...>using namespace std;int main(int argc, char* argv[]){ // 插入迭代器: 将两个数组合并,并插入到集合容器st中 int iArray1[]...// 将数组元素从后插入到ve容器中 copy(iArray3,iArray3+len,back_insert_iterator>(ve)); copy(ve.begin()
Front_insert_iterator 和 Back_insert_iterator 是两种STL提供的迭代器适配器,主要用于实现容器的插入操作。...这两种适配器都是在使用中间层的帮助下实现容器的插入操作,其主要作用是在输出迭代器(通常是一个容器)的末尾自动添加新的元素。...下面是具体用例,通过使用插入迭代器我们可以将一组数据插入到容器中的前或后等位置。...> using namespace std; int main(int argc, char* argv[]) { // 插入迭代器: 将两个数组合并,并插入到集合容器st中 int iArray1...}; // 将数组元素从后插入到ve容器中 copy(iArray3,iArray3+len,back_insert_iterator>(ve)); copy(ve.begin
数组以指针的形式支持迭代器,但数组是C++语言的一部分,并非库。...list和sllist,所有的标准关联容器 条款2:小心对"容器无关代码"的幻想 STL是建立在泛化基础上的:数组泛化为容器,参数化了所包含的对象的类型;函数泛化为了算法,参数化了所用的迭代器的类型;指针泛化为迭代器...举例: 1,insert在一个序列容器中,它保留在你放置的位置;但insert到一个关联容器,会按照排列顺序把这个对象移到它应该在的位置 2,erase一个序列容器,会返回一个新迭代器;但在关联容器上什么都不返回...的区间版本替代 v1.insert(v1.end(), v2.begin() + v2.size() /2, v2.end()); //我们要知道:几乎所有目标区间被插入迭代器指定的copy的使用都可以用调用的区间成员函数来代替...(insertLoc, data[i]);//每次调用insert会使insertLoc无效 ++insertLoc; } //copy: 插入迭代器 inserter,back_inserter
迭代器 很惊奇,迭代器不属于容器,也不属于算法。 扮演起容器与算法之间的“粘合剂”,是“泛型指针”。 原生指针可以作为一种迭代器,不过迭代器一般是以智能指针的形式存在的。...函数指针可视为狭义上的仿真函数。 配接器 说来话长,一种用于修饰容器、迭代器、仿真函数的东西。...insert_aux(end(),x); //更底层了,看上面那张图 } } 注意:一旦引起空间重新配置,指向原Vector的所有迭代器都将失效!!!...list的迭代器和vector的不同,它的要求更高一些。因为链表使用的存储空间往往是零零散散的,所以list的迭代器必须有能力在杂乱的存储空间中快速的跳转。...相对于Vector,List还有一个优势,就是不论如何的插入和接合操作,都不会造成原有的List迭代器失效。List的删除操作也只有指向那个被删除的元素的迭代器失效,其它迭代器不会受影响。
不同于连续的、紧密排列的数组容器Vector,List容器的内部是由双向链表构成的,使得它在插入和删除操作上,就如同行云流水一般顺畅,不需移动其它元素。...2.3 迭代器类 我们思考一下这里能不能使用原生指针来完成迭代器的操作(++ == !...= --)当然是不能的,因为链表的物理地址并不是连续的,对原生指针的++或–操作是没有意义的,所以我们需要自行编写迭代器类,对原生指针进行封装,来满足我们特殊的++和–操作。...-> 所以->要返回地址(指针) T* operator->()//编译器会进行省略-> { return &_node->_data; } }; 这样迭代器类就大致写好了,那么一般我们的迭代器应该还要支持...,删除后会造成迭代器失效,所以需要更新迭代器,返回被删除节点的下一个节点的迭代器即可。
1、你好,List 从实现层面看,相较于Vector的线性空间,List的实现要复杂的多。 List的优势在于每次插入或删除一个元素,就分配或释放一个位置。...的介绍 增 Rect a; ··· test.push_back(a); test.push_front(a); //头尾插入(双向链表) //定点插入 test.insert(test.begin...List的迭代器和Vector还是有一定区别的,所以我特地分一块出来。...List的迭代器不能随便用普通指针来替代,因为其节点不会在内存中持续存在。...List的迭代器在有一个很好的特性,就是它不会因为节点的增加或合并(splice)操作而失效,即使是删除,也只会使得当前指向被删节点的那个迭代器失效,而不会因记忆体的重置使得全部的迭代器失效。
200、 STL中list与queue之间的区别 1) list不再能够像vector一样以普通指针作为迭代器,因为其节点不保证在存储空间中连续存在; 2) list插入操作和结合才做都不会造成原有的list...迭代器失效; 3) list不仅是一个双向链表,而且还是一个环状双向链表,所以它只需要一个指针; 4) list不像vector那样有可能在空间不足时做重新配置、数据移动的操作,所以插入前的所有迭代器在插入操作之后都仍然有效...list与vector的另一个区别是,在插入和接合操作之后,都不会造成原迭代器失效,而vector可能因为空间重新配置导致迭代器失效。...,但是其迭代器并不是普通的指针,其复杂程度比vector高很多,因此除非必要,否则一般使用vector而非deque。...插入失败(重复插入)返回false,此时返回的是已经存在的元素,则可以取到它的实值 (insert(value_type(k, T()))).first; //迭代器 *((insert(value_type
,否则就很容易造成重复析构及越界访问 出自书籍《STL源码剖析》 侯捷著 本文重点: 深度拷贝、迭代器失效 ---- ️正文 vector 的结构比较特殊,成员变量为三个指针 #pragma...{ public: typedef T value_type; typedef value_type* pointer; //指针 typedef const value_type*...vector 中的迭代器就是原生指针,如 begin() == _start、end() == _finish typedef T value_type; typedef value_type* iterator...} 结果: 原因: 我们通常认为,在 insert 后,迭代器失效,不能再使用,当然将此迭代器更新,也能正常使用 while (val < 100) { it = v.insert...(it, val++); it++: //接收 insert 返回值,更新迭代器 } 注意: erase 后,也会出现迭代器失效情况,在 PJ 版本中,对 erase 迭代器失效情况零容忍,只要是删除后没有即使更新迭代器
所有STL容器都附带有自己专属的迭代器——是的,只有容器设计者才知道如何遍历自己的元素,原生指针(Native pointer)也是一种迭代器。...指向数组内部的指针对于数组来说也是随机访问迭代器。 二、底层原理及相关面试题 1、Vector vector底层是一个动态数组,内存是连续的,每次以原来空间大小的2倍来进行扩容的。...注意:对容器进行连续插入或者删除操作(insert/erase),一定要更新迭代器,否则第一次insert或者erase完成,迭代器就失效了。...(6)迭代器失效情况 当插入一个元素到vector中,由于引起了内存重新分配,所以指向原内存的迭代器全部失效。 当删除容器中一个元素后,待迭代器所指向的元素已经被删除,也会造成迭代器失效。...(1)迭代器 因为list的底层结构为带头结点的双向循环链表,可将迭代器暂且理解为指针,迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。
所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。 仿函数:行为类似函数,可作为算法的某种策略。...protected : //元素的指针的指针(pointer of pointer of T) // 其实就是T**,一个二级指针,维护一个二维数组 typedef pointer...插入和删除元素不会造成“指向至其他元素”的指针,引用和迭代器失效。...对 set 进行插入删除操作 都不会引起iterator的失效,因为迭代器相当于一个指针指向每一个二叉树的节点,对set的插入删除并不会改变原有内存中节点的改变, 但是vector的插入删除操作一般会发生内存移动和内存拷贝...vector迭代器失效的情况 当插入一个元素到vector中,由于引起了内存重新分配,所以指向原内存的迭代器全部失效。 当删除容器中一个元素后,该迭代器所指向的元素已经被删除,那么也造成迭代器失效。
操作系统和编译器是怎么知道的?...35 面向对象的三大特征 36 说一说 c++ 中四种cast转换 37 C++ 的空类有哪些成员函数 38 对 c++ 中的smart pointer四个智能指针:shared_ptr,unique_ptr...53 vector迭代器失效的情况 54 正确释放vector的内存(clear(), swap(), shrink_to_fit()) 55 list的底层原理 56 什么情况下用vector,什么情况下用...62 map 、set、multiset、multimap的特点 63 为何map和set的插入删除效率比其他序列容器高,而且每次insert 之后,以前保存的iter 64 为何map和set不能像vector...67 迭代器失效的问题 68 STL线程不安全的情况
领取专属 10元无门槛券
手把手带您无忧上云