iterator的用法 | reverse_iterator的封装实现
进阶C++__STL__容器list使用方法【简单易懂】https://blog.csdn.net/qq_61386381/article/details/125922910
进阶C++__STL__容器vector使用方法【简单易懂】_https://blog.csdn.net/qq_61386381/article/details/125869840
对 map 和 set 来说,它们的 erase 函数返回的 void,而在进行 erase 之后,当前迭代器会失效,无法再用于获取下一个迭代器。因此需要 erase 之前就获取指向下一个元素的迭代器
tmpIt = it;++it;c.erase(tmpIt);
利用后缀++操作符的特性(先创建副本,然后再递增迭代器,然后返回副本)上面的三行代码可以简化为一行:
c.erase(it++);
list 正向遍历删除元素示例(vector 用法相同):
list<int>::iterator it;for (it = l.begin(); it != l.end();){if (0 == (*it) % 2) {it = l.erase(it);}else {++it;}}
map 正向遍历删除元素示例(set 用法相同):
map<int, int>::iterator mit;for (mit = m.begin(); mit != m.end();){if (0 == mit->first % 2) {m.erase(mit++);}else {++mit;}}
reverse_iterator的封装实现
反向迭代器适配器(reverse_iterator),可简称为反向迭代器或逆向迭代器,常用来对容器进行反向遍历,即从容器中存储的最后一个元素开始,一直遍历到第一个元素。
值得一提的是,反向迭代器底层可以选用双向迭代器或者随机访问迭代器作为其基础迭代器。不仅如此,通过对 ++(递增)和 --(递减)运算符进行重载,使得:
- 当反向迭代器执行 ++ 运算时,底层的基础迭代器实则在执行 -- 操作,意味着反向迭代器在反向遍历容器;
- 当反向迭代器执行 -- 运算时,底层的基础迭代器实则在执行 ++ 操作,意味着反向迭代器在正向遍历容器。
另外,实现反向迭代器的模板类定义在 <iterator> 头文件,并位于 std 命名空间中。
函数接口
// 将以下代码适配到vector和list中做反向迭代器,理解反向迭代器的原理
namespace bit
{// 适配器 -- 复用template<class Iterator, class Ref, class Ptr>struct Reverse_iterator{Iterator _it;typedef Reverse_iterator<Iterator, Ref, Ptr> Self;Reverse_iterator(Iterator it):_it(it){}Ref operator*(){Iterator tmp = _it;return *(--tmp);}Ptr operator->(){return &(operator*());}Self& operator++(){--_it;return *this;}Self& operator--(){++_it;return *this;}bool operator!=(const Self& s){return _it != s._it;}};
}
函数实现
namespace bit
{template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;// 反向迭代器适配支持typedef Reverse_iterator<iterator, T&, T*> reverse_iterator;typedef Reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;const_reverse_iterator rbegin() const{// list_node<int>*return const_reverse_iterator(end());}const_reverse_iterator rend() const{return const_reverse_iterator(begin());}reverse_iterator rbegin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}iterator begin(){return _start;}iterator end(){return _finish;}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}// ...
}namesapce std
{template<class T>class list{typedef list_node<T> Node;public:typedef __list_iterator<T, T&, T*> iterator;typedef __list_iterator<T, const T&, const T*> const_iterator;// 反向迭代器适配支持typedef Reverse_iterator<iterator, T&, T*> reverse_iterator;typedef Reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;const_iterator begin() const{// list_node<int>*return const_iterator(_head->_next);}const_iterator end() const{return const_iterator(_head);}iterator begin(){return iterator(_head->_next);//return _head->_next;}iterator end(){return iterator(_head);}const_reverse_iterator rbegin() const{// list_node<int>*return const_reverse_iterator(end());}const_reverse_iterator rend() const{return const_reverse_iterator(begin());}reverse_iterator rbegin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}//...}}
iterator的用法 | reverse_iterator的封装实现相关推荐
- STL迭代器(iterator)用法详解
C++ STL迭代器(iterator)用法详解 无论是序列容器还是关联容器,最常做的操作无疑是遍历容器中存储的元素,而实现此操作,多数情况会选用"迭代器(iterator)"来实 ...
- boost::iterator::permutation_iterator用法的测试程序
boost::iterator::permutation_iterator用法的测试程序 实现功能 C++实现代码 实现功能 boost::iterator::permutation_iterator ...
- boost::iterator的用法测试实例
boost::core模块boost::iterator的用法测试实例 实现功能 C++实现代码 实现功能 boost::core模块boost::iterator的用法测试实例 C++实现代码 #i ...
- 迭代器Iterator的用法
迭代器Iterator的用法 和枚举一样,表示一些对象的集合,主要用于对数组进行遍历,定义如下: package java.util; public interface Iterator { bool ...
- C++迭代器(iterator)用法
C++迭代器(iterator)用法 1.简述 迭代器是一种检查容器内元素并遍历元素的数据类型 2.vector示例 //将vector的元素值全部修改为2 vector<int> v(1 ...
- mysql迭代器_迭代器是什么,C++ STL迭代器(iterator)用法详解
无论是序列容器还是关联容器,最常做的操作无疑是遍历容器中存储的元素,而实现此操作,多数情况会选用"迭代器(iterator)"来实现.那么,迭代器到底是什么呢? 我们知道,尽管不同 ...
- Iterator 的用法
今天在看别人程序时看到 Iterator 在程序中用法,感觉自己对这个Iterator 好像不知道似的,确实也不太清楚,平时写程序也没有用过,到网上查了下它的用法,感觉也不是很很难,做过笔记.以前可以 ...
- log4c日志库的用法,再封装及其完整例子
找了多篇文章,发现都讲的不怎么简明.自己摸索了下,记录如下: Log4c中有三个重要的概念, Category, Appender, Layout. Category用于区分不同的Logger, 其实 ...
- s:iterator的用法
转自:http://blog.sina.com.cn/s/blog_5bd6b451010130if.html struts2的s:iterator 可以遍历 数据栈里面的任何数组,集合等等以下几个简 ...
最新文章
- 如何锻炼自己的抗干扰能力
- 【问题收录】Android Studio 2.2使用时出现问题总结
- 查询方式中断方式_【每日“一”题】中断方式
- RandomAccessFile简介与使用
- IMail邮件服务-1
- 【Processing日常2】群星1
- Js模拟select选择框,参照IE8样式
- 矩阵分析及应用(10章 - 张量分析)
- 直击备份恢复的痛点:基于 TiDB Binlog 的快速时间点恢复
- 中国石油大学《机械原理》第二次在线作业
- Pr速成3小时学会视频剪辑[副业学习会]
- JVM 类加载器(引导类加载器、扩展类加载器、系统类加载器、用户自定义类加载器)
- 分解因数和求因子个数
- c语言main必须返回int,C语言 错误:’:: main’必须返回’int’
- 数字图像处理中的Region与XLD
- WT588D语音芯片介绍
- 世纪大学计算机专业,世纪大学本科计算机专业教学改革研讨会暨年计算机专业核心课程 (21页)-原创力文档...
- 刘振飞:躲在镜子背后听用户反馈
- 爬取《水门桥》电影评论生成可视化数据及词云
- 什么是CMA检测报告
热门文章
- 2019python程序员月薪多少_最新 | 2019年Python工程师的平均薪资是多少?
- 不了解外贸装箱,这一篇够够的
- 买个ssl证书费用要多少钱?
- 【对称日】今天朋友圈对称日刷屏了,也来凑个热闹,用代码实力打脸
- Mac Android Studio 打包APK 出现的问题
- Android Studio基础输入文本框EditText
- 0x80070570文件或目录损坏且无法读取解决方法
- Debian本地源的创建及应用
- Anomaly Detection 入门概述
- ROCKET PROPULSION ELEMENTS——DEFINITIONS AND FUNDAMENTALS笔记