[C++]iterator
来源:互联网 发布:羞羞的铁拳网络平台 编辑:程序博客网 时间:2024/05/16 17:42
本文,仅对C++ iterator的知识点进行归纳整理,给出设计的关键步骤。
参考:
- 资料一:http://www.cplusplus.com/reference/iterator/(第一参考,简单精要)
- 资料二:http://jjhou.boolan.com/programmer-3-traits.pdf(侯捷随笔,非常全面,有时间深刻可看)
- 资料三:http://en.cppreference.com/w/cpp/iterator(纯资料)
资料精解:
- 资料二
- 推演思路:算法的泛化、迭代器的基本形式及其操作、迭代器与容器的关系、迭代器的五种相应类型。
- 结论:设计适当的相应类型,是迭代器的责任;设计适当的迭代器,则是容器的责任。唯有容器本身,才知道该设计怎样的迭代器来遍历自己,并配合容器的特性完成某些独特行为。
解决问题:
- 五种迭代器的特性(用于查询)
- C++的智能指针:auto_ptr(提及它,是为了更好地理解Iterator)
- 分析自定义容器所需的迭代器操作
- 分析自定义容器所需的迭代器类型(简单分析第一问)
- 迭代器的相应类型:associated types(为何STL-Iterator-class有多个typedef类型?)
- 继承STL的Iterator模板(简化设计,保证自定义Iterator符合STL的规范,并重用STL各类功能)
问题一:链接,给予表格查看,注意后面的说明,不同类型,表示有不同的操作(操作表达式)。
问题二:具体看 [C++]auto_ptr,auto_ptr也是C++标准程式的一种”samrt pointer”,它初步具备泛化的特性。
问题三:相对第一个来说,比较广泛,亦有函数操作、操作符操作等。
一般而言,对于自定义Iterator,必须要包含几个操作:
- inequailty(判断不相等)运算子
- dereferencelm(提领、取值、解引用)运算子
- prefix increment(前置式递增)运算子
- 显然,数组++与链表++是不一样的,这里就可以做一次同一的++操作
- copy(复制)行为(以便产生函式的返回值)
- begin()和end()函数(迭代标兵)
- 构造、赋值操作、拷贝构造、析构(基本类要求)
有了以上的操作,就可以完成很基础的“迭代”操作。
问题四:根据迭代器的移动特性与施行特性,来区分
它们之间往往是以继承is-a关系连结。
选定某类型迭代器,是为了实现方法是最优的、提供最大效率。
问题五:
- 迭代器所指之物的类别,成为迭代器的value type
- difference type用来表示两个迭代器之间的距离
- reference type表示迭代器所指之物是否允许改变。此时作为左值。(引用)
- pointer type表示迭代器所指之物的地址(指针)
问题六:
摘抄自:STL-iterator文件
template <class Category, class T, class Distance = ptrdiff_t,
class Pointer = T*, class Reference = T&>
struct iterator {
typedef T value_type;
typedef Distance difference_type;
typedef Pointer pointer;
typedef Reference reference;
typedef Category iterator_category;
};
STL-Iterator-class不含任何成员,纯粹只是类型定义,继承它不会有任何负担。后面三个是有预设值,一般只需提供前两个,即为:容器元素类型+迭代器类型
阅读全文
0 0
- c ++ iterator
- [C++]iterator
- C++vector 迭代器iterator
- 【c++】迭代器iterator
- Design Pattern - Iterator(C#)
- C++Iterator Categories(迭代器种类)
- C++Primer--string、vector、iterator
- C\C++中iterator与const_iterator及const iterator区别
- Iterator
- Iterator
- Iterator
- iterator
- Iterator
- Iterator
- iterator
- iterator
- Iterator
- iterator
- 本地安装yum脚本
- 深入理解java虚拟机<一>
- 手把手教你在应用里用上iOS机器学习框架Core ML
- python27和python36 共存时安装pip方法,解决python27文件夹下没有script文件方法
- Linux开机启动顺序
- [C++]iterator
- Windows如何修改MySQL用户root密码
- 同步工具类
- 初识Java中的并发
- 解决Oracle数据库IP地址改变创建数据库的问题
- 提问艺术
- c#项目大全
- Nginx(三)之Ngin配置
- url enter之后发生了什么