访问容器中任意元素的速度要比前三种容器慢,这是因为 list 必须从第一个元素或最后一个元素开始访问,需要沿着链表移动,直到到达想要的元素。...函数成员 array vector deque begin() - 返回幵始迭代器 是 是 是 end() - 返回结束迭代器 是 是 是 rbegin() - 返回反向'开始迭代器...是 是 是 rend() - 返回反向结束迭代器 是 是 是 cbegin() - 返M const开始迭代器 是 是 是 cend() - 返回const结束迭代器 是 是 是 crbegin()...- 返回const反向开始迭代器 是 是 是 crend() - 返回const反向结束迭代器 是 是 是 assign() - 用新元素替换原有内容 - 是 是 operator=() - 复制同类型容器的元素...函数成员 list forward list begin() - 返回开始迭代器 是 是 end() - 返回结束迭代器 是 是 rbegin() - 返回反向开始迭代器 是 - rend(
rbegin、rend和crbegin、crend 功能描述 rbegin和crbegin返回指向list首元素的逆向迭代器。...2.2.5 修改器 clear 功能描述 擦除所有元素,使用clear()后,再次调用size(),size函数返回0。...可以直接或间接地指代容器中的值。 earse 功能描述 擦除元素, 函数原型 //移除位于pos的元素 //返回值:最后移除元素之后的迭代器。.../*返回值:最后移除元素之后的迭代器。...若容器中无元素,则行为未定义。指向被擦除元素的迭代器和引用会失效。
文章目录 1 vector转set 2 set转vector 参考文献 1 vector转set 通过unordered_set的构造方法即可获得 unordered_set set(vec.begin...(), vec.end()); 使用vector的rbegin()和rend()反向迭代器可以得到升序结果 unordered_set set(vec.rbegin(), vec.rend()...()和rend()反向迭代器 以下总结一下assign()函数的两种用法: 【语法1】:容器.assign(iterator1, iterator2); // 1.向量 vector_name.assign...deque_name.assign(iterator1, iterator2); // 其他容器, 如array和string等 【语法2】:容器.assign(size, value); 【功能】:向容器中存储...size个value // 1.向量 vector_name.assign(size, value); // 2.队列 deque_name.assign(size, value); // 其他容器,
//3.迭代器: //3.1.遍历 vector::iterator it;//定义迭代器变量it //for (vector::iterator it = vec.begin...= vec1.end(); i++)//也可以用auto自动识别类型,begin()返回第一个元素的迭代器,end() 返回的最后一个元素后面位置的迭代器 (超尾迭代器) { cout reverse_iterator ;//反向迭代器类型 for (auto it2 = vec2.rbegin(); it2 !...= vec2.rend(); it2++)//反向迭代器 { //rbegin 指向最后一个元素的位置 返回的是反向迭代器 //rend()指向最开始元素的前面那个位置 ++是从后向前...//8.反转: reverse(vec.begin(), vec.end());//反转 12345-->54321 reverse(vec.rbegin(), vec.rend()); //9
pop_back 删除vector末尾处的元素。 push_back 在vector末尾处追加一个元素。 rbegin 返回起始位置的反向迭代器。 rend 返回末尾位置的反向迭代器。...remove_if 移除满足谓词条件的元素。 rend 返回list中末尾的反向迭代器。 resize 重新分配长度。 reverse 反转list中元素的顺序。...rbegin 返回指向起始的逆向迭代器。 rend 返回指向末尾的逆向迭代器。 resize 手动改变大小。 shrink_to_fit 释放未使用的内存。 size 返回当前长度。...rbegin 返回指向起始的逆向迭代器。 rend 返回指向末尾的逆向迭代器。 size 返回set中的元素数量。 swap 交换两个set。...rbegin 返回一个反向迭代器,此反向迭代器指向Map起始位置。 rend 返回一个反向迭代器,此反向迭代器指向Map末尾位置。 size 返回当前Map中的元素数量。 swap 交换两个Map。
rbegin() 返回指向最后一个元素的反向迭代器;如果是 const 类型容器,在该函数返回的是常量反向迭代器。 rend() 返回指向第一个元素之前一个位置的反向迭代器。...如果是 const 类型容器,在该函数返回的是常量反向迭代器。此函数通常和 rbegin() 搭配使用。...图 2 迭代器的具体功能示意图 从图 2 可以看出,这些成员函数通常是成对使用的,即 begin()/end()、rbegin()/rend()、cbegin()/cend()、crbegin()/crend...deque 模板类中还提供了 rbegin() 和 rend() 成员函数,它们分别表示指向最后一个元素和第一个元素前一个位置的随机访问迭代器,又常称为反向迭代器(如图 2 所示)。...在对容器做添加元素的操作之后,如果仍需要使用之前以创建好的迭代器,为了保险起见,一定要重新生成。
在官方库中,反向迭代器是使用适配器封装的,即用普通的迭代器去作为适配器,然后封装出一个反向迭代器出来。 关于迭代器的解析,在介绍实习list以及迭代器这篇文章中有较详细讲解。...*this; } Slef& operator--() { ++it;//会调用正向迭代器的operator++(); return *this; } 反向迭代器的解引用 根据官方库中的源代码...,我们可以分析得到,反向迭代器中的rbegin和rend,与正向迭代器的end()和begin()是对称的。 ...Ptr operator->() { return *(operator*()); } 反向迭代器的构造函数 只需在初始化列表上,将迭代器指向的节点或顺序表中的某个位置赋值给反向迭代器的对象即可...//反向迭代器的rend() reverse_iterator rend() { //通过begin()返回链表的尾节点,然后通过构造函数将反向迭代器的对象初始化,并且是浅拷贝,指向同一块空间
1 迭代器定义 C++标准委员会对迭代器的定义为:指向元素范围(如数组或容器)中的某个元素,并能够使用一组操作符(至少使用自增(++)和解引用(*)操作符)遍历该范围中的元素的任何对象。...指针是最常见的一种迭代器,指针可以指向数组中的元素并使用自增运算符遍进行遍历,除了数组外,也可以使用迭代器对向量、列表、集合的等容器进行遍历。...3 迭代器的使用方式 按照迭代器的使用方式,迭代器可以分为以下四种,如: 正向迭代器:定义方式为:容器名::iterator,也是最常使用的迭代器类型,代码如下: #include <iostream...vector中插入了5个元素,然后又通过正向迭代器遍历容器元素并输出,运行结果如下: myvector contains: 5 4 3 2 1 从结果可知,通过反向迭代器向插入元素元素和插入顺序是方向的...常量反向迭代器:定义方式为:容器名::const_reverse_iterator下面的例子就通过常量反向迭代器遍历容器中的元素。
文章目录 一、什么是反向迭代器 二、STL 源码中反向迭代器的实现 三、reverse_iterator 的模拟实现 四、vector 和 list 反向迭代器的实现 一、什么是反向迭代器 C++ 中一共有四种迭代器...,反向迭代器的特点如下: rbegin() 相当于 end(); rend() 相当于 begin(); 反向迭代器++相当于正向迭代器–; 其他操作比如 * !...反向迭代器的使用:反向迭代器的使用和正向迭代器完全相同 void reverse_iterator_test() { vector v; v.push_back(1); v.push_back...---- 二、STL 源码中反向迭代器的实现 我们可以通过参考 STL 源码中反向迭代器的实现方式来学习如何实现反向迭代器,如下: //list.h部分源码 -- SGI版 template <class...,而 rbegin 由 end 适配得到,所以反向迭代器中 operator*() 不是返回迭代器当前位置的数据,而是返回迭代器前一个位置的数据,不然会发生越界访问。
rbegin、rend和crbegin、crend rbegin和crbegin返回指向vector首元素的逆向迭代器。...它对应非逆向vector的末元素,若vector为空,则返回的迭代器等于rend或crend。...earse earse的函数主要功能是擦除元素,其声明如下: //移除位于pos的元素 //返回值:最后移除元素之后的迭代器。.../*返回值:最后移除元素之后的迭代器。...使用shrink_to_fit()降低内存 从vector中擦除元素不会改变其容量,因此未存放的元素的位置对应内存不会被释放,如果后续不需要再使用这些空闲的内存,可以使用shrink_to_fit()对该内存进行释放
rbegin + rend begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器 范围for C++11支持更简洁的范围for的新遍历方式 operator[] 作用:返回对字符串中位置...= s1.end()) { cout << *it << endl; ++it; } 反向迭代器rbegin与rend reverse_iterator rend() noexcept; rbegin...返回指向字符串的最后一个字符(即其反向开头)的反向迭代器。...rbegin返回指向字符串的最后一个字符(即其反向开头)的反向迭代器。...这是因为 e 是对 s3 中字符的引用。 如果只是想读取字符串而不修改它,通常会使用 const auto& 来声明迭代器变量,以避免意外修改字符串的内容。
---- 前言 适配器模式是 STL 中的重要组成部分,在上一篇文章中我们学习了 容器适配器 的相关知识,即 stack 与 queue,除了 容器适配器 外,还有 迭代器适配器,借助 迭代器适配器,可以轻松将各种容器中的普通迭代器转变为反向迭代器...,这正是适配器的核心思想 ---- ️正文 反向迭代器适用于所有的容器,因此它是作为一个单独的 .h 文件出现的,别的容器如果想使用,直接包含就行了 1、反向迭代器设计 反向迭代器 reverse_iterator...结果:1 2 3 4 5 反向迭代器:反向遍历 结果:5 4 3 2 1 注:库中的反向迭代器在设计时,为了最求极致的对称,rbegin() 指向最后一个有效元素的下一个位置,rend() 指向第一个有效元素...,使用 Ptr 具体返回对象(引用 / 指针)是否为 const 修饰,取决于调用方 1.3、极致对称 在反向迭代器类中,有一个十分奇怪的函数 operator*(),它返回的并非当前所指向的对象,而且上一个对象...= v.rend()) { cout << *rit << " "; ++rit; //反向迭代器++,就是-- } cout << endl; } 可以成功使用反向迭代器进行遍历
反向迭代器 1.定义: 在容器中从尾元素向首元素反向移动的迭代器 对于反向迭代器,递增和递减的含义会颠倒过来 递增一个反向迭代器会移动到前一个元素 递减一个迭代器会移动到下一个元素...注意:除了forward_list容器之外,其他容器都支持反向迭代器 2.使用反向迭代器的相关函数 rbegin() —指向容器尾元素 rend()—指向容器首元素之前一个位置 crbegin()...毕竟反向迭代器的目的是在序列中反向移动。...例如我们输入的是: bird,dog,duck,pig,则这条语句会打印gip 问题所在: 我们使用的是反向迭代器,会方向处理string,因此上述输出语句从crbegin()开始反向打印line的内容...而我们希望按正常顺序打印从rcomma开始到line末尾间的字符。但是我们不能直接使用rcomma。 因为它是一个反向迭代器,意味着它会朝着string的开始位置移动.
一、set 集合容器遍历 1、使用迭代器进行正向迭代与反向迭代 std::set 集合容器 提供了 begin、end、rbegin 和 rend 这几个成员函数,用于 获取 迭代访问链表中的元素 的...迭代器 , 函数原型如下 : 获取首元素迭代器 : 返回一个迭代器 , 指向集合的第一个元素 ; iterator begin(); const_iterator begin() const; 获取尾元素之后的迭代器...end() const; 获取指向尾元素的反向迭代器 : 该函数返回一个反向迭代器 , 指向集合容器的最后一个元素 ; 如果集合容器为空 , 则此操作未定义 ; 反向迭代器从集合的尾部向头部移动 ;...获取指向首元素之前的反向迭代器 : 返回一个反向迭代器 , 指向集合的 超出头部 ”的位置 , 即第一个元素的前一个位置 ; 该迭代器 它用于与 rbegin 一起实现完整的逆向迭代 ; reverse_iterator...rend(); const_reverse_iterator rend() const; 迭代器的位置如下图所示 : 正向迭代示例 : // 遍历 set 集合容器 , 正向迭代 for (set
由于拼接的方式有很多,效率也各不相同,所以查了资料之后,选择了StringBuilder的方式,据说速度最快,但有线程安全的问题,而且只有JDK5支持。...++的string本身就有一个reverse方法,接收开始和结束的迭代器,就可以做到反转了,但是提交后显示速度非常慢。...后来想到用copy配合rbegin、rend的反向迭代器来做,或者不要copy了,直接就返回一个反向迭代器构造出的字符串,看讨论中其他人也用过这种方法,但是可能是后来新增了示例,遇到有换行的字符串就会报错...(string s) { // 直接用reverse方法: return reverse(s.begin(), s.end()); // copy搭配反向迭代器...// 反向迭代器搭配构造函数: // return string(s.rbegin(), s.rend()); } }; 查看作者首页
()返回末尾的迭代器 erase()删除一个元素 front()返回第一个元素 get_allocator()返回list的配置器 insert()插入一个元素到list中 max_size(...push_front()在list的头部添加一个元素 rbegin()返回指向第一个元素的逆向迭代器 remove()从list删除元素 remove_if()按指定条件删除元素 rend(...)指向list末尾的逆向迭代器 resize()改变list的大小 reverse()把list的元素倒转 size()返回list中的元素个数 sort()给list排序 splice()合并两个...()返回指向容器最后一个元素的迭代器 最后,要介绍的是C++中map容器的基本用法,也就是很常见的key-value对容器。...()返回键值>=给定元素的第一个位置 max_size()返回可以容纳的最大元素个数 rbegin()返回一个指向map尾部的逆向迭代器 rend()返回一个指向map头部的逆向迭代器 size
list和vector的差别: 在list中,因为其内存分配是非连续的,因此不能像vector那样用[]操作符取值。而仅仅能用迭代器来訪问list中的元素。...List将元素按顺序储存在链表中,与向量(vector)相比, 它同意高速的插入和删除。可是随机訪问却比較慢。...true end() 返回末尾的迭代器 erase() 删除一个元素 front() 返回第一个元素 get_allocator() 返回list的配置器 insert()...) 删除第一个元素 push_back() 在list的末尾加入一个元素 push_front() 在list的头部加入一个元素 rbegin() 返回指向第一个元素的逆向迭代器...remove() 从list删除元素 remove_if() 按指定条件删除元素 rend() 指向list末尾的逆向迭代器 resize() 改变list的大小 reverse
前言 反向迭代器的使用相信大家都已经比较熟悉了,那我们这篇文章具体讲什么呢? ,这篇文章我们重点来讲一下反向迭代器的模拟实现。 那为什么我们之前不和正向迭代器放在一块讲呢?...那现在大家思考一个问题:单从使用的角度来看,反向迭代器和正向迭代器有什么区别?...其实区别好像也不是很大,就是正向迭代器的++是从前往后走,而反向迭代器的++是从后往前走,那对于list来说正向++是_node = _node->_next;,那反向就应该是_node = _node...然后是不是还要提供rbegin和rend啊: 那rbegin应该返回最后一个元素的迭代器 rend应该返回 第一个元素的前一个,那对于list来说就是头结点嘛 那对应的代码就是这样。...,那接下来就给大家解释一下这样做真正的牛逼之处: 大家想一下,对于我们的list来说,我们使用最开始我们自己的方法去实现反向迭代器(拷贝一份正向迭代器的代码,进行一些简单修改),确实也可以。
反向迭代器 我们在实现正向迭代器的时候,它的++是下一个元素,--为上一个元素。...对于反向迭代器它就是相反的,++为上一个元素,--为下一个元素 反向迭代器是复用了正向迭代器iterator cpptemplate <class Iterator,class Ref,class..._it; } }; list反向迭代器的使用 cpp typedef __reverse_iterator reserve_iterator; typedef _...rend()const { return reserve_iterator(begin()); } 反向迭代器的头为为正向迭代器的尾,正向迭代器的尾为反向迭代器的头,所以我们设计反向迭代器的时候在访问里面数据的时候...因为反向迭代器的头为尾,里面不是有效数据,这样设置的目的是为了和正向迭代器保持对称。
二、迭代器遍历容器 1、正向迭代与反向迭代 std::list 双向链表容器 提供了 begin、end、rbegin 和 rend 这几个成员函数,用于 获取 迭代访问链表中的元素 的 迭代器 , 函数原型如下...: 获取首元素迭代器 : 返回一个迭代器 , 指向链表的第一个元素 ; iterator begin(); const_iterator begin() const; 获取尾元素之后的迭代器 :...end() const; 获取指向尾元素的反向迭代器 : 该函数返回一个反向迭代器 , 指向链表的最后一个元素 ; 如果链表为空 , 则此操作未定义 ; 反向迭代器从链表的尾部向头部移动 ; 获取指向首元素之前的反向迭代器...: 返回一个反向迭代器 , 指向链表的 超出头部 ”的位置 , 即第一个元素的前一个位置 ; 该迭代器 它用于与 rbegin 一起实现完整的逆向迭代 ; reverse_iterator rend(...); const_reverse_iterator rend() const; 迭代器的位置如下图所示 : 正向迭代示例 : // 正向迭代 for (list::iterator
领取专属 10元无门槛券
手把手带您无忧上云