首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从零开始学C++之STL(十):迭代适配器{(插入迭代back_insert_iterator)、IO流迭代(istream_iterator、ostream_iterator)}

一、迭代适配器 反向迭代 插入迭代 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; ->; ++; ==; !

99900
您找到你想要的搜索结果了吗?
是的
没有找到

发布一个STL源码剖析专栏及序列式容器deque

,需重新分配/复制数据/释放原始空间;不过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函数,否则在容器中直接插入元素

86830

从零开始学C++之STL(三):迭代vector::iterator 和 vector::reverse_iterator 的实现、迭代类型、常用的容器成员

一、迭代 迭代是泛型指针 普通指针可以指向内存中的一个地址 迭代可以指向容器中的一个位置 STL的每一个容器类模版中,都定义了一组对应的迭代类。...上面介绍的是vector::iterator ,比如 list::iterator 实现是类似的,内部成员也是一个指针,不过是指向Node 结点的指针,如: _Nodeptr _Ptr;// pointer...map, set, list类型提供双向迭代,而string, vector和deque容器上定义的迭代都是随机访问迭代,用作访问内置数组元素的指针也是随机访问迭代。...2、对于顺序式容器(vector)元素的删除、插入操作会导致指向该元素以及后面的元素的迭代失效。...众所周之当使用一个容器的insert或者erase函数通过迭代插入或删除元素"可能"会导致迭代失效,因此建议我们获取insert或者erase返回的迭代,以便用重新获取新的有效的迭代进行正确的操作

2K00

C++Vector使用方法

还有v. insert(pointer, content),v.insert(pointer,a[2],a[4])将a[2]到a[4]三个元素插入。...这个简单介绍表示了仅仅要有元素须要插入并且容器的容量不足时就会发生又一次分配(包含它们维护的原始内存分配和回收,对象的拷贝和析构和迭代指针和引用的失效)。...在大小和容量之间的关系让我们能够预言什么时候插入将引起vector或string运行又一次分配,并且,能够预言什么时候插入会使指向容器中的迭代指针和引用失效。...假设不是运行push_back,代码在string的任何位置进行一个insert,我们仍然能够保证在插入期间没有发生又一次分配,可是,与伴随string插入迭代失效的一般规则一致,全部从插入位置到string...结尾的迭代/指针/引用将失效。

26120

C++小知识之Vector用法

还有v. insert(pointer, content),v.insert(pointer,a[2],a[4])将a[2]到a[4]三个元素插入。...这个简介表示了只要有元素需要插入而且容器的容量不足时就会发生重新分配(包括它们维护的原始内存分配和回收,对象的拷贝和析构和迭代指针和引用的失效)。...在大小和容量之间的关系让我们可以预言什么时候插入将引起vector或string执行重新分配,而且,可以预言什么时候插入会使指向容器中的迭代指针和引用失效。...如果不是执行push_back,代码在string的任意位置进行一个insert,我们仍然可以保证在插入期间没有发生重新分配,但是,与伴随string插入迭代失效的一般规则一致,所有从插入位置到string...结尾的迭代/指针/引用将失效。

72130

C++(STL):21---deque之源码剖析

也因此,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

93830

C++(STL):15--- list源码剖析

,额外内存开销大 设计目的:令容器在任何位置进行插入和删除都很快 何时使用: 容器需要不断地在中间插入或删除元素 无论删除还是增加,list的迭代、引用、指针都不会失效 与其他容器的比较: vector...三、list的迭代 list不再能够 vector一样以原生指标做为迭代,因为其节点不保证在储存空间中连续存在 list迭代必须有能力指向list的节点,并有能力做正确的递增、递减、取值、成员存取等动作...这在vector是不成立的,因为 vector插入动作可能造成记忆体重新配置,导致原有的迭代全部失效 甚至list的元素删除动作(erase),也只有“指向被删除元素”的那个迭代失效,其他迭代不受任何影响...首先配置并构造一个节点,然后在尾端进行适当的指针动作,将新节点插入进去: //函数目的:在迭代 position 所指位置插入一个节点,内容为x iterator insert(iterator position...由于list不像vector 那样有可能在空间不足时做重新配置、数据移动的操作,所以插入前的所有迭代插入动作之后都仍然有效 ?

65930

STL容器的线程安全性了解多少?

数组以指针的形式支持迭代,但数组是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

1.3K10

开发成长之路(6)-- C++从入门到开发(C++知名库:STL入门·容器(一))

迭代 很惊奇,迭代不属于容器,也不属于算法。 扮演起容器与算法之间的“粘合剂”,是“泛型指针”。 原生指针可以作为一种迭代,不过迭代一般是以智能指针的形式存在的。...函数指针可视为狭义上的仿真函数。 配接 说来话长,一种用于修饰容器、迭代、仿真函数的东西。...insert_aux(end(),x); //更底层了,看上面那张图 } } 注意:一旦引起空间重新配置,指向原Vector的所有迭代都将失效!!!...list的迭代vector的不同,它的要求更高一些。因为链表使用的存储空间往往是零零散散的,所以list的迭代必须有能力在杂乱的存储空间中快速的跳转。...相对于Vector,List还有一个优势,就是不论如何的插入和接合操作,都不会造成原有的List迭代失效。List的删除操作也只有指向那个被删除的元素的迭代失效,其它迭代不会受影响。

31710

【C++】手搓 list 容器

不同于连续的、紧密排列的数组容器Vector,List容器的内部是由双向链表构成的,使得它在插入和删除操作上,就如同行云流水一般顺畅,不需移动其它元素。...2.3 迭代类 我们思考一下这里能不能使用原生指针来完成迭代的操作(++ == !...= --)当然是不能的,因为链表的物理地址并不是连续的,对原生指针的++或–操作是没有意义的,所以我们需要自行编写迭代类,对原生指针进行封装,来满足我们特殊的++和–操作。...-> 所以->要返回地址(指针) T* operator->()//编译会进行省略-> { return &_node->_data; } }; 这样迭代类就大致写好了,那么一般我们的迭代应该还要支持...,删除后会造成迭代失效,所以需要更新迭代,返回被删除节点的下一个节点的迭代即可。

6110

走近STL -- 你好,List

1、你好,List 从实现层面看,相较于Vector的线性空间,List的实现要复杂的多。 List的优势在于每次插入或删除一个元素,就分配或释放一个位置。...的介绍 增 Rect a; ··· test.push_back(a); test.push_front(a); //头尾插入(双向链表) //定点插入 test.insert(test.begin...List的迭代Vector还是有一定区别的,所以我特地分一块出来。...List的迭代不能随便用普通指针来替代,因为其节点不会在内存中持续存在。...List的迭代在有一个很好的特性,就是它不会因为节点的增加或合并(splice)操作而失效,即使是删除,也只会使得当前指向被删节点的那个迭代失效,而不会因记忆体的重置使得全部的迭代失效。

35330

《逆袭进大厂》第四弹之C++重头戏STL30问30答

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

1.5K20

C++ STL学习之【vector的模拟实现】

,否则就很容易造成重复析构及越界访问 出自书籍《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 迭代失效情况零容忍,只要是删除后没有即使更新迭代

19620

深入理解STL库_STL文件格式的工作原理

所有STL容器都附带有自己专属的迭代——是的,只有容器设计者才知道如何遍历自己的元素,原生指针(Native pointer)也是一种迭代。...指向数组内部的指针对于数组来说也是随机访问迭代。 二、底层原理及相关面试题 1、Vector vector底层是一个动态数组,内存是连续的,每次以原来空间大小的2倍来进行扩容的。...注意:对容器进行连续插入或者删除操作(insert/erase),一定要更新迭代,否则第一次insert或者erase完成,迭代就失效了。...(6)迭代失效情况 当插入一个元素到vector中,由于引起了内存重新分配,所以指向原内存的迭代全部失效。 当删除容器中一个元素后,待迭代所指向的元素已经被删除,也会造成迭代失效。...(1)迭代 因为list的底层结构为带头结点的双向循环链表,可将迭代暂且理解为指针迭代失效即迭代所指向的节点的无效,即该节点被删除了。

53410

STL 总结与常见面试题

所有STL容器都附带有自己专属的迭代,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代。 仿函数:行为类似函数,可作为算法的某种策略。...protected : //元素的指针指针(pointer of pointer of T) // 其实就是T**,一个二级指针,维护一个二维数组 typedef pointer...插入和删除元素不会造成“指向至其他元素”的指针,引用和迭代失效。...对 set 进行插入删除操作 都不会引起iterator的失效,因为迭代相当于一个指针指向每一个二叉树的节点,对set的插入删除并不会改变原有内存中节点的改变, 但是vector插入删除操作一般会发生内存移动和内存拷贝...vector迭代失效的情况 当插入一个元素到vector中,由于引起了内存重新分配,所以指向原内存的迭代全部失效。 当删除容器中一个元素后,该迭代所指向的元素已经被删除,那么也造成迭代失效。

86530
领券