stl迭代器原理
具体实现肯定不如书上讲的清楚了,这里只是根据侯捷书上的讲解,自己建立一条思路以及形成一些相关的概念
迭代器也可被称作智能指针,用于遍历容器内的元素,stl每个容器都实现了自己的iterator,iterator可以是一个类对象,也可以是原生指针
因此对迭代器进行解应用操作的时候需要重载* ->运算符,使之能正确返回元素对象,这两个重载是迭代器的核心
另外stl实现了算法和容器的泛型,如何能使算法顺利的对容器进行操作,这又是stl的泛型化必须要解决的问题
这时迭代器又扮演了中介的角色,只需把容器的迭代器传给算法就可以对容器进行操作
新问题又出现了,算法接受迭代器作为参数,这其中又可能用到迭代器所关联的元素型别,比如以关联型别作为返回值
如何获取迭代器关联型别,惯性思维我们可能会这样来做:
iterator::value_type fun();
但是当迭代器是原生指针时,这种用法就不合乎语法了,比如int*,它根本就不是一个类,value_type也就无从谈起了
单独为原生指针弄一套算法是可以,但却背离了泛型思想的初衷,也不可能抛弃原生指针,也就是说iterator本身已经定型,它已经
满足了我们操作容器内部元素的需要,不能在iterator上做文章,因此引入第三方是个不错的办法,也是程序设计中常用的一种思想
关联的双方都没有改进余地的时候,引入第三者总是可以起到四两拨千斤的作用,也就是stl中的traits机制
算法不直接取迭代器的关联型别,而是通过一个traits类来获取,如下
template <class T>
class I_traits
{
typedef typename T::value_type value_type;
};
typename I_traits<iter>::value_type fun();
这样并体现不出traits调停者的作用
为了支持原生指针,除了通用性traits模板,还可以建立该模板的偏特化版本,对模板参数类型作进一步的限制
template <class T>
class I_traits<T *>
{
typedef typename T::value_type value_type;
};
好了不直接使用iterator的valuetype而是通过traits类对iterator进行提取,这样就避免了原生指针不能携带自己的关联型别这种特殊情况,使迭代器的使用方仍然能得到迭代器的关联型别
无论iterator是不是原生指针对traits类型调用valuetype成员都是合法的。
stl迭代器原理的更多相关文章
- C++ STL迭代器原理和简单实现
1. 迭代器简介 为了提高C++编程的效率,STL(Standard Template Library)中提供了许多容器,包括vector.list.map.set等.然而有些容器(vector)可以 ...
- STL迭代器iterator
一:迭代器原理 迭代器是一个“可遍历STL容器内全部或部分元素”的对象. 迭代器指出容器中的一个特定位置. 迭代器就如同一个指针. 迭代器提供对一个容器中的对象的访问方法,并且可以定义了容器中对象的范 ...
- STL迭代器笔记
STL迭代器简介 标准模板库(The Standard Template Library, STL)定义了五种迭代器.下面的图表画出了这几种: input output \ ...
- 一步一步的理解C++STL迭代器
一步一步的理解C++STL迭代器 "指针"对全部C/C++的程序猿来说,一点都不陌生. 在接触到C语言中的malloc函数和C++中的new函数后.我们也知道这两个函数返回的都是一 ...
- STL 迭代器 iterator const
STL迭代器很多时候可以当成指针来使用. 但是指针一般可以用const来控制访问. 那迭代器呢. #include <iostream> #include <vector> u ...
- STL迭代器的使用、正向、逆向输出双向链表中的所有元素
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- 【STL 源码剖析】浅谈 STL 迭代器与 traits 编程技法
大家好,我是小贺. 点赞再看,养成习惯 文章每周持续更新,可以微信搜索「herongwei」第一时间阅读和催更,本文 GitHub : https://github.com/rongweihe/Mor ...
- stl 迭代器(了解)
STL 主要是由 containers(容器),iterators(迭代器)和 algorithms(算法)的 templates(模板)构成的. 对应于它们所支持的操作,共有五种 iterators ...
- c++ stl nth_element 原理解析
nth_element是stl中的一个库函数,它会使迭代器nth所指的元素与整个[first,last)完整排序后.同一个位置的元素同值.即找到完整排序时第n位的正确值. 但这个函数与完整排序的区别在 ...
随机推荐
- 获取UIColor中的RGB值(本人亲测多个获取RGB值的方法,这个最有效)
在自己研发的项目个人项目中,碰到一个从颜色中获取RGB值的需求. 在网上找了许久,也有一些方法可以获取RGB值,但不能获取黑白以及灰色的值(他们是非RGB颜色空间,不清楚什么意思,反正亲测确实获取不了 ...
- javascript中创建对象的几种方式
1. 使用Object构造函数来创建一个对象,下面代码创建了一个person对象,并用两种方式打印出了Name的值. var person = new Object(); person.name=&q ...
- JS创建自定义对象
普通对象的创建: 创建对象: 1.people = new Object(); people.name = "lin"; people.age = "26“; 2.创建字 ...
- poj2104 线段树 划分树
学习:http://www.cnblogs.com/pony1993/archive/2012/07/17/2594544.html 划分树的build: 划分树是分层构建的,在构建的t层时,我们可以 ...
- SVG 2D入门7 - 重用与引用
前面介绍了很多的图形元素,如果很多图形本身是一样的,需要每次都去定义一个新的么?我们能否共用一些图形呢?这是这节的重点 - SVG元素的重用. 组合 - g元素 g元素是一种容器,它组合一组 ...
- 12-27cell 的可重用性(英雄列表应用性能的优化)
在英雄列表中动态生成cell的代码在中, - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N ...
- 多动手试试,其实List类型的变量在页面上取到的值可以直接赋值给一个js的Array数组变量
多动手试试,其实List类型的变量在页面上取到的值可以直接赋值给一个js的Array数组变量,并且数组变量可以直接取到每一个元素var array1 = '<%=yearList =>'; ...
- 谈谈你对http的理解
一.先看一张图: 二.要client与sever能沟通 1.需要一样的规则,遵循一定的规范-----------协议 好比:不同国家的人,需要一门通用的语言. 2.谈到协议------http---- ...
- 自定义UIPageControl
iphone的UIPageControl控件可以显示用户huan'dong滑动到的页码.但是里面的小点的颜色时默认的白色.如果背景也是白色的hu话,你就悲剧了.于是乎上网找了一些资料,找到了改变UIP ...
- iOS开发之修改动画对象的元素属性
步骤:1.使用single view application创建新的项目 2.在.h文件中使用UIimageview创建两个图片实例对象,使用UIDynamicAnimator创建动画对象 3.在.m ...