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

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

STL(Standard Template Library)标准模板库提供了模板适配器和迭代等重要概念,为开发者提供了高效、灵活和方便的编程工具。...模板适配器是指一组模板类或函数,它们提供一种适配机制,使得现有的模板能够适应新的需求。而迭代则是STL中的令一种重要的概念,它是一个抽象化的数据访问机制,通过迭代可以遍历STL容器中的元素。...Reverse_iterator 是STL提供的一种用于反向迭代的适配器。...一个reverse_iterator对象接受一个普通迭代参数,并将该迭代反转。如此一来,通过++运算符将使迭代指向前一个元素,而*运算符返回的是它所指向的下一个元素。...= (const reverse_iterator& rhs) const; }; 下面是一个使用reverse_iterator的例子,该迭代是一个用随机访问迭代构造出来的迭代,用于反向迭代容器元素

19610

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

STL(Standard Template Library)标准模板库提供了模板适配器和迭代等重要概念,为开发者提供了高效、灵活和方便的编程工具。...模板适配器是指一组模板类或函数,它们提供一种适配机制,使得现有的模板能够适应新的需求。而迭代则是STL中的令一种重要的概念,它是一个抽象化的数据访问机制,通过迭代可以遍历STL容器中的元素。...Reverse_iterator 是STL提供的一种用于反向迭代的适配器。...一个reverse_iterator对象接受一个普通迭代参数,并将该迭代反转。如此一来,通过++运算符将使迭代指向前一个元素,而*运算符返回的是它所指向的下一个元素。...= (const reverse_iterator& rhs) const;};下面是一个使用reverse_iterator的例子,该迭代是一个用随机访问迭代构造出来的迭代,用于反向迭代容器元素

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

    c++ 迭代失效_c++迭代是什么

    C++ 迭代(Iterator) 1.1 定义 迭代是一种检查容器内元素并遍历元素的数据类型。 迭代是一个变量,提供对一个容器中的对象的(间接)访问方法,并且定义了容器中对象的范围。...迭代可以指向容器中的某个元素,通过迭代就可以对非数组(存储空间不连续)的数据结构进行遍历。 容器和string有迭代类型同时拥有返回迭代的成员。...反向迭代和正向迭代的区别在于: 对正向迭代进行++操作时,迭代会指向容器中的后一个元素; begin() -> end() 从前往后遍历 对反向迭代进行++操作时,迭代会指向容器中的前一个元素...STL 中有用于操作迭代的三个函数模板,它们是: advance(p, n):使迭代 p 向前或向后移动 n 个元素。...STL 迭代失效的几种情况总结 C++容器类插入和删除时迭代的失效情况总结 序列式(数组式) 容器 vector 迭代失效 (1)erase() 和 insert() 会使当前位置到容器末尾元素的迭代全部失效

    1.1K40

    C++】—— list迭代

    前言 ​ C++ 中的 STL(标准模板库)为我们提供了多种容器,vector、list以及stack等; ​ 对于这些容器STL提供了统一的遍历方法,那就是迭代——可以高效地进行插入和删除操作。...迭代是遍历这些容器的重要工具,本篇文章将详细讲解 C++ STL 中 list 容器的迭代(iterator)使用方式、类型以及相关的注意事项。...2、迭代 ​ 在 C++ STL 中,迭代(iterator)是用于遍历容器元素的对象。你可以将迭代类比为一个指针,它指向容器中的元素。...3、迭代基本用法 在 C++ 中,我们可以使用 begin() 和 end() 方法获取 list 的迭代。这些迭代可以用来遍历 list 中的所有元素。...5.3、清除数据 使用 clear() 清空整个 list,此操作后所有迭代都会失效: mylist.clear(); 6、总结 ​ C++ STL 中的 list 迭代是操作 list 容器的关键工具

    8710

    C++】反向迭代

    文章目录 一、什么是反向迭代 二、STL 源码中反向迭代的实现 三、reverse_iterator 的模拟实现 四、vector 和 list 反向迭代的实现 一、什么是反向迭代 C++ 中一共有四种迭代...,反向迭代的特点如下: rbegin() 相当于 end(); rend() 相当于 begin(); 反向迭代++相当于正向迭代–; 其他操作比如 * !...,而并没有去实现反向迭代,今天我们就来探究如何实现反向迭代。...reverse_iterator 的模板参数,而反向迭代是 reverse_iterator 的对象,所以反向迭代是一个容器适配器,它的适配容器就是对应的正向迭代,这样它就能根据传递过来的正向迭代的不同实例化出对应的反向迭代...//const 迭代 -- 增加模板参数,解决 operator*() 返回值与 operator->() 返回值问题 //typedef __list_iterator

    90600

    C++迭代

    迭代的概念 迭代是用来访问string对象或vector对象的元素的,类似于下标运算和指针。...迭代的使用 不同于指针,获取迭代不是使用取地址符,有迭代的类型同时拥有返回迭代的成员; 比如,这些类型拥有名为begin和end的成员,begin成员负责返回指向第一个元素(或第一个字符)的迭代...如果迭代为空,则begin和end返回的是同一个迭代; 标准容器迭代的运算符 ? 和指针类似,也能通过解引用迭代来获取它所指向的元素,执行解引用的迭代必须合法并确实指向着某个元素。...但凡是使用了迭代的循环体,都不要向迭代所属的容器添加元素; 迭代运算 ?...迭代的算术运算 可以令迭代和一个整数值相加(或相减),其返回值是向前(或向后)移动了若干个位置的迭代

    85150

    C++ vector迭代失效

    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了。

    23710

    C++ 认识容器的迭代

    原因是通过迭代删除指定的元素时,指向那个元素的迭代将失效,如果再次对失效的迭代进行 ++ 操作,则会带来未定义行为,程序崩溃。...2.STL中容器的迭代的底层实现机制 提到STL,必须要马上想到其主要的6个组成部件,分别是:容器、迭代、算法、仿函数、适配器和空间分配器,迭代是连接容器和算法的一种重要桥梁。...由于C++中的内部嵌套类与外围的类没有联系,为了访问外部类对象的值,我们必须要传入一个引用(或指针,本例中传入引用)。Iterator的自增方法其实就是增加内部的一个索引值。判断!...=的方法是和另外一个迭代做比较,这个迭代一般是集合的末尾,当我们的索引值等于末尾的索引值end时,认为迭代已经达到了末尾。...参考文献 编写高质量代码:改善C++程序的150个建议.李健.机械工业出版社.

    60620

    C++】 vector 迭代失效问题

    C++】 vector 迭代失效问题 一....迭代失效问题分析 迭代的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代就是原生态指针T。...因此迭代失效,实际就是迭代底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代, 程序可能会崩溃)。...但是原来定义的的迭代未作处理依旧指向原来的地址,这就是导致迭代失效的原因。 也就是说:一旦扩容就会导致迭代失效。...迭代失效解决办法:在使用前,对迭代器重新赋值即可 看图分析: 一旦经过扩容后原来的迭代指针 it 不可在用,因为它还指向原来的旧空间,旧空间会被释放,旧空间释放后 it 就会变为野指针,需要重新更新迭代

    10010

    C++】容器类_容器迭代

    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

    65910

    C++】开始了解反向迭代

    1 前言 在复刻STL中的list容器时,我们首次采用了类封装的方式来构建迭代,以此实现迭代的递增、递减和元素访问功能。...因为反向迭代与正向迭代在功能上存在高度一致性,唯一的区别在于它们在容器中的移动方向相反。因此,我们可以采用适配器设计模式,对现有的正向迭代进行二次封装,以此满足反向迭代的需求。...接下来我们也来实现一下自己的反向迭代: 3 复刻反向迭代 通过对反向迭代的设计模式的了解,我们可以大致写一个框架: namespace bit { // 适配器 -- 复用 //给谁的正向迭代就产生谁的正向迭代...实现反向迭代的基本方法是通过编写一个类模板,该模板会被编译器用来生成具体容器对应的迭代实例。在这个过程中,编译负责实例化这些迭代,从而提供一种便捷的方式来反向遍历容器中的元素。...3.1 加减操作 根据反向迭代的性质,我们可以借助正向迭代的函数来实现反向迭代的加减操作。

    14210

    C++设计模式 - 迭代模式

    迭代模式 ❝提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 ❞ C++ STL中各个容器都有迭代的体现,通过迭代能够顺序的访问该容器各成员。...因为现存的标准库都有提供各种容器List、Array等,都有提供迭代遍历。这里只是简单分析这种模式的实现原理。 类图 迭代模式类图 CIteratorBase: 迭代基类。...注: 为了实现通用的迭代迭代类使用了泛型编程的模板方法。...此容器持有一个迭代成员,外部可以通过此迭代来访问容器中的各个元素。 由于本设计迭代需要访问聚合类私有的成员,因此将CIterator定义为友元,为了避免重复引用,前置声明CIterator。...可以实现新型的集合和迭代并将其传递给现有代码, 无需修改现有代码。 可以并行遍历同一集合, 因为每个迭代对象都包含其自身的遍历状态。 在C++ STL库中已经提供迭代的实现。

    48020

    初识C++ · 反向迭代简介

    我们实现const迭代的时候,有两种路,一是直接来一个类,二是通过模板,非const迭代的复用来实现的,同理,我们实现反向迭代的话,也可以每种结构都来一个单独的反向迭代的类,但是科学家们觉得太麻烦了...高到一个反向迭代可以适配所有的结构,本质上就是复用原来的正向迭代,两种迭代的区别只是遍历的方向不同而已,即++变成--,源码的实现方式比较复杂,我们实现方式是,传正向迭代过来,复用对应正向迭代的函数即可...,这里就需要单独创建一个类模板了。...反向迭代的实现 我们大思路是通过判断传的迭代的不同,调用对应正向迭代的函数,所以我们创建的反向迭代的类的成员变量是iterator,实现的接口还是那么几个,!...第一个参数是迭代,也就是判断复用谁的迭代,第二个参数是引用,第三个参数是指针类型。 这里需要引入一个问题 这是我们没真正接触反向迭代之前所猜想的反向迭代结构。

    9310

    C++标准库类型迭代

    迭代类型 就像不知道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

    74610

    C++认识容器的迭代

    原因是通过迭代删除指定的元素时,指向那个元素的迭代将失效,如果再次对失效的迭代进行++操作,则会带来未定义行为,程序崩溃。...2.STL中容器的迭代的底层实现机制 提到STL,必须要马上想到其主要的6个组成部件,分别是:容器、迭代、算法、仿函数、适配器和空间分配器,迭代是连接容器和算法的一种重要桥梁。...=的方法是和另外一个迭代做比较,这个迭代一般是集合的末尾,当我们的索引值等于末尾的索引值end时,认为迭代已经达到了末尾。...在泛型算法中,为了对集合中的每一个元素进行操作,我们通常要传入集合的迭代头、迭代尾,以及谓词,例如std::find_if(vec.begin(),vec.end(),…),这种泛型算法其实就是在迭代的首位反复迭代...---- 参考文献 [1]编写高质量代码:改善C++程序的150个建议.李健.机械工业出版社.

    1.2K10

    C++】STL——反向迭代的模拟实现:迭代适配器

    库里面反向迭代的实现——迭代适配器 ,我们来看一下库里面list的迭代是如何实现的 我们看到,这里的反向迭代包括const版本的,它们都是对reverse_iterator这个类模板的一个typedef...,但是它们的模板参数却是传的正向迭代。...(因为里面反向的++需要复用正向的- -,反向- -复用正向++) 所以,对于任何一个容器,只要迭代至少是双向的,都可以用Reverse_Iterator这个类模板去适配出其反向的迭代。...那我们来试一下吧,把vector的反向迭代也搞出来: 那有了Reverse_Iterator这个迭代适配器的模板类,我们现在想要适配出vector的反向迭代,怎么搞?...我Reverse_Iterator是一个类模板,你给我任何容器的正向迭代,只要支持++和- -,我就给你适配出反向迭代来。 ,这才是它真正的牛逼之处。 6.

    17410

    C++ STL map迭代失效问题

    最后想了一下,是不是某个地方线程做了耗时或者同步阻塞操作导致的,或者线程中执行了死循环,排查后发现是因为一个同事在对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容器迭代失效情况分析、总结 迭代失效的几种情况总结

    60410

    c++】反向迭代的探究实现

    _it; } }; } 在这个模板代码示例中,ReverseIterator 类型是一个反向迭代,它是基于提供的正向迭代类型 Iterator 来实现的。...= 总结编译处理: 本来每个容器都要写一个反向迭代的累,但是自己写,太费劲了 本质写一个反向迭代的类模板,给编译传不同的容器的正向迭代实例化,编译帮助我们实例化出各种容器的对应反向迭代...编写一个通用的反向迭代模板可以省去为每个容器单独定义反向迭代的麻烦。...C++ 标准库中的 std::reverse_iterator 就是这样一个通用的反向迭代适配器。...它接收一个正向迭代作为模板参数,反转了其遍历方向,使得利用正向迭代的容器可以很容易地提供反向迭代能力 使用类模板可以使得编译根据你向模板传递的不同正向迭代类型,为每个具体的容器类型生成对应的反向迭代实例

    10910

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券