阅读STL源码剖析笔记 —— 迭代器概念
来源:互联网 发布:nba2k online mac 编辑:程序博客网 时间:2024/05/16 12:29
摘自侯捷老师的STL源码剖析:一些概念和自己理解的东西:
1.iterator pattern :提供一种方法,使之能够依序寻访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式。
2.STL的中心思想:将数据容器(数据结构) 和 算法 分开,彼此独立设计,最后再以一种粘合剂将它们绑在一起。
3.iterator是一种smart pointer:迭代器是一种行为类似指针的对象,所以迭代器最重要的工作就是重载 operator* (这个返回引用)和 operator -> (这个返回指针)
侯捷老师针对一个简单的链表构造了一个自己的迭代器:
template <Item>struct ListIter{ Item* ptr; //定义了一个指向节点的指针 ListIter(Item*p = 0) : ptr(p){} //用指向节点的指针初始化(构造)迭代器 Item& operator*() {return *ptr} //迭代器的解引用,返回元素的引用 Item* operator->() {return ptr} //返回指向元素的指针 ListIter& operator++() //前置++ {ptr = ptr->next;return *this;} ListIter operator++(int) //后置++ {ListIter tmp = *this; ++*this; return tmp;} bool operator==(const ListIter& i) {return ptr == i.ptr;} bool operator!=(const ListIter& i) {return ptr != i.ptr;}};
其中:Item是指装载在自己或者STL定义的List容器里面的元素类型,(自己的理解:迭代器把原始的指向容器里面的元素的指针做了一些包装,让这个指针能在特定的容器里面移动,由于上面定义的迭代器是针对单向链表的,所以没有重载前置--和后置--操作符,重载++操作符, 也是利用了链表节点中的指向下一个节点的指针来完成这项操作),但是上面这个迭代器的实现类过多地暴露了节点,违反了iterator pattern。
我们只有在非常了解List的实现细节之后,我们才能设计出迭代器,正是因为这个原因,每一种STL容器都会提供专属的迭代器
(自己的理解:不同的数据结构有着不同的实现,访问元素的方法也不同,所以每一个容器都有自己的迭代器)
0 0
- 阅读STL源码剖析笔记 —— 迭代器概念
- 阅读STL源码剖析笔记 —— vector
- 《STL源码剖析》阅读笔记
- STL源码剖析-迭代器概念
- 迭代器的型别 《STL 源码剖析》阅读笔记
- 《STL源码剖析》阅读笔记1
- 《STL源码剖析》---stl_construct.h阅读笔记
- 《STL源码剖析》---stl_alloc.h阅读笔记
- 《STL源码剖析》---stl_uninitialized阅读笔记
- 《STL源码剖析》---stl_iterator.h阅读笔记
- 《STL源码剖析》---stl_vector.h阅读笔记
- 《STL源码剖析》---stl_list.h阅读笔记
- 《STL源码剖析》---stl_stack.h阅读笔记
- 《STL源码剖析》---stl_heap.h阅读笔记
- 《STL源码剖析》---stl_slist.h阅读笔记
- 《STL源码剖析》---stl_tree.h阅读笔记
- 《STL源码剖析》---stl_set.h阅读笔记
- 《STL源码剖析》---stl_map.h阅读笔记
- FZUOJ-2128 最长子串(strstr函数枚举暴力)
- 深入理解javascript原型和闭包系列 深入理解javascript原型和闭包(1)——一切都是对象
- XUtils net
- 树状数组
- android开发之SearchView
- 阅读STL源码剖析笔记 —— 迭代器概念
- Z字形扫描
- Redis监控工具—Redis-stat、RedisLive
- 在Ubuntu平台下编译比特币bitcoin客户端
- 0 / 1 背包问题--动态规划(附详细注释)
- FORM表单 validity setCustomValidity和checkValidity使用
- Android5.x 新控件之RecyclerView,CardView,Palette的使用
- linux下的命令
- 算法复习-归并、快排、插入、堆-c++实现