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

C++学习笔记-迭代(iterator)与萃取机(traits)

ite = vec.begin(); 3、迭代相应类别 既然迭代要把两个独立的部件算法容器撮合在一起,那么相应的类别必须得一样;当然,编译是自带参数推导的,就比如函数模板,它是会自己推导出传递的是什么类型...typename I::value_type //这一行都是func的返回类型(因为I是一个template参数,在编译器具现之前,编译对I一无所知,使用typename可以告诉编译这是一个类型...func(I ite){ return *ite; } 但是指针不能内嵌类型,如果迭代一个原生指针不就无法内嵌?... class Demo {}//这就是类型上的特化,只接受原生指针; 回到之前的问题;算法容器两个独立的部件靠迭代撮合一起的,那必须对应的类型要一样,就好比是这样一个场景...你知道迭代如果说不知道,,那就类型不对就无法进行下去了,如果说知道,那算法就直接说,那好,要对你指向的容器进行操作了,这样操作自然而然的就通顺了,,那迭代是怎么回答算法这个问题的呢?

1.7K20

C++ STL源码剖析之Traits编程技法

C++ STL 源码剖析之 Traits 编程技法 0.导语 STL 编程,容器算法是独立设计的,即数据结构算法是独立设计的,连接容器算法的桥梁就是迭代了,迭代器使其独立设计成为可能。...而在算法我们可能会定义简单的中间变量或者设定算法的返回变量类型,这时候需要知道迭代所指元素的类型是什么,但是由于没有 typeof 这类判断类型的函数,我们无法直接获取,那该如何是好?...参数推导 首先,算法运用迭代时,很可能会用到其相应型别(associated type)(迭代所指之物的型别)。...假设算法中有必要声明一个变量,以"迭代所指对象的型别"为型别,该怎么办呢? 解决方法是:利用 function template 的参数推导机制。...只要做一个 iterator,然后定义的时候为其指向的对象类型制定一个别名,就好了,像下面这样: template struct MyIter { typedef T value_type

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

C++奇迹之旅:vector使用方法以及操作技巧

std::vector 是一个类模板,它的定义如下: template > class vector; 模板参数...对于涉及末尾以外的位置插入或删除元素的操作,它们的性能比其他操作差,并且迭代引用的一致性低于列表forward_lists。...是输入迭代类型,可以是指向数组的指针、其他容器的迭代等。...非 const 版本: iterator begin(); 返回类型: iterator,这是一个指向容器第一个元素的迭代。 用途: 可以用于遍历修改容器的元素。...需要注意的是,调用 insert 函数时,如果 vector 的大小需要扩张以容纳新的元素,则会自动分配新的内存空间。这可能会导致迭代、指针引用失效,因此使用这些元素时需要格外小心。

5000

【C++】STL梳理

---- 0x1 C++ STL C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类函数,这些模板类函数可以实现多种流行常用的算法和数据结构,如向量、链表、队列...每一种容器都有其优点缺点,所以为了应付程序的不同需求,STL 准备了七种基本容器类型。 迭代(Iterators):用来一个对象集合的元素上进行遍历动作。...(优点) 总结:相当于可拓展的数组(动态数组),随机访问快,头部中间插入或删除效率低,但在尾部插入或删除效率高,适用于对象简单,变化较小,并且频繁随机访问的场景。...val = value_type(), const allocator_type& alloc = allocator_type()) template list...(优点) 总结:由红黑树实现,其内部元素依据其值自动排序,每个元素值只能出现一次,不允许重复,且插入删除效率比用其他序列容器高,适用于经常查找一个元素是否某集合且需要排序的场景。

66721

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

不要被事务的表面现象锁迷惑,你看它是分段连续线性空间,就以为它是vectorlist的结合体,取长补短?其实不然。 为了维持整体连续的假象,数据结构的设计及迭代前进后退等操作都颇为繁琐。...---- deque的 deque采用一块所谓的map映射,来看吧: template class...此外,deque还维护start、finish两个迭代,分别指向第一缓冲区的第一个元素最后缓冲区的最后一个元素(的下一个位置)。...原先也疑惑于为何同一级左边的节点会比右边节点大,后来想明白了。 插入过程,这个顺序被打乱是难以避免的,况且这个排序于取出数据并无影响,所以没必要在做额外工作对树的底层做那么精细的排序。...下面来看一下算法的实现细节: //该函数接受两个迭代,用来表现一个heap底部容器的头尾,并且新元素已经插入到底部容器的最尾端。

33120

C++ 模板沉思录(下)

5.1 迭代的advance函数 STL的advance函数,可用于将迭代向前(后)推进N步。...同时,我们可以以迭代类别作为Advance函数的第三参数,从而重载出多个不同版本的Advance函数。...此时,只要我们使用迭代类别(作为第三参数)去调用__Advance函数,编译就将根据重载确定规则,选择适用于当前迭代类别的__Advance函数进行调用了。...但最后,我们还有一个重要问题需要解决:指针也是迭代,那么指针的迭代类型(当然是随机访问迭代)怎么获取? 也许不用说,你就已经知道答案了,解决方案就是“加中间层可解决一切问题”定理。...7.6 让标量也加入进来 在数学一个向量不仅可以一个向量相加,还可以一个标量(即一个T类型的值)相加。本节我们就来实现这一功能。

1.1K30

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

一、迭代 迭代是泛型指针 普通指针可以指向内存一个地址 迭代可以指向容器一个位置 STL的每一个容器类模版,都定义了一组对应的迭代类。...与前向迭代相似,但是两个方向上都可以对数据遍历 随机访问迭代 也是双向迭代,但能够序列的任意两个位置之间进行跳转 下图是不同类型的迭代能够实现的操作: ?...map, set, list类型提供双向迭代,而string, vectordeque容器上定义的迭代都是随机访问迭代,用作访问内置数组元素的指针也是随机访问迭代。...2、在其首部或尾部删除元素则只会使指向被删除元素的迭代失效。 3、deque容器的任何其他位置的插入删除操作将使指向该容器元素的所有迭代失效。  ...众所周之当使用一个容器的insert或者erase函数通过迭代插入或删除元素"可能"会导致迭代失效,因此建议我们获取insert或者erase返回的迭代,以便用重新获取新的有效的迭代进行正确的操作

2K00

走进STL - heap,小树芽

heap,可能听过的人不多,这篇主要留给我有缘人看吧。 1、heap是什么 heap并不属于STL容器组件,它是个“幕后白手”,扮演priority queue的助手。...原先也疑惑于为何同一级左边的节点会比右边节点大,后来想明白了。 插入过程,这个顺序被打乱是难以避免的,况且这个排序于取出数据并无影响,所以没必要在做额外工作对树的底层做那么精细的排序。...下面来看一下算法的实现细节: //该函数接受两个迭代,用来表现一个heap底部容器的头尾,并且新元素已经插入到底部容器的最尾端。...接下来将尾节点原根节点的两个子节点比较大小,将大的那个推上根节点。见上图步骤三。同样留下一个洞洞。 循环这个“向下流放”的过程,直到原尾结点插入树或者到了最底层。见上图步骤四。...2.4 heap迭代 嘿嘿,那当然是没有迭代了,所有元素都必须遵循特别的排列规则,又不提供遍历功能,要什么迭代

24520

C++箴言:理解typename的两个含义

模板定义语法关键字class与typename的作用完全一样。     typename难道仅仅在模板定义起作用?...声明一个 template type parameter(模板类型参数)的时候,class typename 意味着完全相同的东西。...它是一个用糊涂的方法实现的糊涂的函数,而且就像我下面写的,它甚至不能编译,但是请将这些事先放在一边——有一种方法能发现的愚蠢: template // print 2nd...例如,这是一个取得一个 container(容器)这个 container(容器)一个 iterator(迭代)的 function template函数模板): template<typename...假设我们一个取得一个 iterator(迭代)的 function template函数模板),而且我们要做一个 iterator(迭代)指向的 object(对象)的局部拷贝 temp,我们可以这样做

4.6K20

图解|从武侠角度探究STL排序算法的奥秘

sort函数的应用场景 SGI STL的sort的参数是两个随机存取迭代RandomAccessIterator,sort的模板也是基于此种迭代的,因此如果容器不是随机存取迭代,那么可能无法使用通用的...关联容器 mapset底层是基于RB-Tree,本身就已经自带顺序了,因此不需要使用sort算法 序列容器 list是双向迭代并不是随机存取迭代,vectordeque是随机存取迭代适用于sort...快速排序堆排序的配合 __introsort_loop函数主要封装了快速排序堆排序,来看看这个函数的实现细节: //sort函数的入口 template <class RandomAccessIterator...堆排序的细节 //注:这个是带自定义比较函数的堆排序版本 //堆化堆顶操作 template ...= last; ++i) __linear_insert(first, i, value_type(first)); } 插入函数同样出现了__unguarded_xxx这种形式的函数

40330

C++ 模板元编程简介

模版元程序由元数据函数组成,元数据就是元编程可以操作的数据,即C++编译在编译期可以操作的数据。...元函数是模板元编程中用于操作处理元数据的“构件”,可以在编译期被“调用”,因为它的功能形式运行时的函数类似,而被称为元函数它是元编程中最重要的构件。...4.模板元编程的控制逻辑 第一个 C++ 模板元程序由Erwin Unruh 1994 年编写,这个程序计算小于给定数 N 的全部素数(又叫质数),程序并不运行(都不能通过编译),而是让编译错误信息显示结果...我们想让 mysum() 对指针参数也能工作,毕竟迭代就是模拟指针,但指针没有嵌套类型 value_type,可以定义 mysum() 对指针类型的特例,但更好的办法是函数参数 value_type...有了这样的判断,还可以根据判断结果做更复杂的元编程逻辑(如一个算法以迭代为参数,根据迭代标签进行特例化以对某种迭代特殊处理)。标签还可以用来分辨函数重载。

6.6K42

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

iterator_traits 被称为特性萃取机,能够方面的让外界获取以下5型别: value_type迭代所指对象的型别 difference_type:两个迭代之间的距离 pointer:迭代所指向的型别...连续存储结构:vector是可以实现动态增长的对象数组,支持对数组高效率的访问和在数组尾端的删除插入操作,中间和头部删除插入相对不易,需要挪动大量的数据。...vector迭代使用后就失效了,而list的迭代使用之后还可以继续使用。...list与vector的另一个区别是,插入接合操作之后,都不会造成原迭代失效,而vector可能因为空间重新配置导致迭代失效。...dequevector的最大差异一个是deque运行在常数时间内对头端进行元素操作,二是deque没有容量的概念,它是动态地以分段连续空间组合而成,可以随时增加一段新的空间并链接起来 deque虽然也提供随机访问的迭代

1.5K20

C++ STL学习之【反向迭代

,这正是适配器的核心思想 ---- ️正文 反向迭代适用于所有的容器,因此它是作为一个单独的 .h 文件出现的,别的容器如果想使用,直接包含就行了 1、反向迭代设计 反向迭代 reverse_iterator...可以用来反向遍历容器,某些场景下很实用 反向迭代需要有:正向迭代对象、构造函数 template struct __reverse_iterator {...结果:1 2 3 4 5 反向迭代:反向遍历 结果:5 4 3 2 1 注:库的反向迭代设计时,为了最求极致的对称,rbegin() 指向最后一个有效元素的下一个位置,rend() 指向第一个有效元素...Ref;同理,涉及 operator->() 时,需要返回目标对象指针,使用 Ptr 具体返回对象(引用 / 指针)是否为 const 修饰,取决于调用方 1.3、极致对称 反向迭代,有一个十分奇怪的函数...vector list 进行了测试,成功实现了反向遍历 如果你觉得本文写的还不错的话,可以留下一个小小的赞,你的支持是分享的最大动力!

12720

【C++】红黑树封装实现 map set

是运行修改的,所以 map 的普通迭代封装红黑树的普通迭代即可,而不用将其封装为红黑树的 const 迭代同时,我们也不用担心 map 的 key 被修改的问题,因为 map 定义红黑树的成员变量时传递给红黑树的...– 在前面map set 的使用那一节我们知道 map 支持 [] 访问,并且 map 的 operator[] 其实同时具备插入、查找修改 (修改 value) 的功能,下面将之前博客的图放出来便于大家回忆...insert 函数的返回值进行返回,而是先将它的返回值赋值给一个键值对,该键值对由红黑树的普通迭代一个布尔值构成,然后再用该键值对构造一个由红黑树的 const 迭代 (set 的普通迭代)...答案红黑树的迭代 – 可以看到红黑树的迭代貌似实现了一个拷贝构造函数,但奇怪的地方在于该函数的参数是一个普通迭代,而不是 Self,而这就是关键所在: 当模板实例化为 ...现在我们参照 stl 源码的思路来改造我们的迭代 set insert 函数: __RBTreeIterator: template struct

80430

超详细STL之array容器使用及实现原理解析

说明一下,用的是gcc7.1.0编译,标准库源代码也是这个版本的。 本篇文章讲述STLarray的使用及原理。...{ ... }; 有些书上说array也是一个class,但是这个版本看到的是struct,不过没有关系,除了一些细微的方面,structclass并无太大的区别,这里可以看到array...迭代函数 //这里value_type就是定义一个array时指定的元素类型,比如在上面的例子,它就是int类型 typedef value_type*...: 一是同样的函数可以返回可读可写只读两种,比如begin,同样的函数参数,只是返回类型const属性不一样; 二是反转迭代反转一下其实是指向当前位置的前一个元素的迭代,也就是说除了位置反转了...operator[]at函数都实现了两个,与上面的迭代一样,根据左值判断具体调用哪一个函数

74430

10.1 C++ STL 模板适配与迭代

STL(Standard Template Library)标准模板库提供了模板适配器迭代等重要概念,为开发者提供了高效、灵活方便的编程工具。...模板适配器是指一组模板类或函数,它们提供一种适配机制,使得现有的模板能够适应新的需求。而迭代则是STL的令一种重要的概念,它是一个抽象化的数据访问机制,通过迭代可以遍历STL容器的元素。...适配器与迭代两者的紧密配合,使得开发者能够高效地处理容器的元素,提高了代码的复用性可维护性。...); 其中Predicate是一个一元谓词,而返回值是一个封装了谓词的std::unary_negate对象,它是一个可调用的函数对象,并可以STL的算法函数中使用。...这两种适配器都是使用中间层的帮助下实现容器的插入操作,其主要作用是输出迭代(通常是一个容器)的末尾自动添加新的元素。

17710

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

---- 前言 vector 是 STL 的容器之一,其使用方法类似于数据结构的 顺序表,得益于范型编程 C++ 特性的加持,vector 更强大、更全能;模拟实现 vector 时,还需要注意许多细枝末节...2、迭代相关 vector 迭代就是原生指针,如 begin() == _start、end() == _finish typedef T value_type; typedef value_type...,即 const 对象的 const 迭代 反向迭代在后续文章中进行专门讲解 利用前面的函数构造对象,通过迭代遍历对象,结果如下 ---- 3、容量相关 3.1、查看容量 直接通过迭代获取值...返回值,更新迭代 } 注意: erase 后,也会出现迭代失效情况, PJ 版本,对 erase 迭代失效情况零容忍,只要是删除后没有即使更新迭代,就会直接报错;而在 SGI 版,...vector 模拟实现的全部内容了,感兴趣的同学可以自己试着写一下,不过需要特别注意 深度拷贝 迭代失效 问题 如果你觉得本文写的还不错的话,可以留下一个小小的赞,你的支持是分享的最大动力!

19720

10.1 C++ STL 模板适配与迭代

STL(Standard Template Library)标准模板库提供了模板适配器迭代等重要概念,为开发者提供了高效、灵活方便的编程工具。...模板适配器是指一组模板类或函数,它们提供一种适配机制,使得现有的模板能够适应新的需求。而迭代则是STL的令一种重要的概念,它是一个抽象化的数据访问机制,通过迭代可以遍历STL容器的元素。...适配器与迭代两者的紧密配合,使得开发者能够高效地处理容器的元素,提高了代码的复用性可维护性。10.1 函数对象适配器Bind2nd 是一个函数适配器,可以用来将一个双参函数转换成一个单参函数。...;其中Predicate是一个一元谓词,而返回值是一个封装了谓词的std::unary_negate对象,它是一个可调用的函数对象,并可以STL的算法函数中使用。...是STL提供的两种迭代适配器,它们分别用于将输入流输出流封装成迭代的形式,以便于使用STL提供的算法函数处理输入输出流。

17920
领券