博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STL 笔记(四) 迭代器 iterator
阅读量:6956 次
发布时间:2019-06-27

本文共 2466 字,大约阅读时间需要 8 分钟。

stl 中迭代器能够理解为面向对象版本号的广义指针,提供了对容器中的对象的訪问方法,能够遍历容器全部元素。也能够訪问随意元素。stl 迭代器有下面五种:
  • Input iterators   仅仅读,输入迭代器,支持如:istream
  • Output iterators  仅仅写,输出迭代器。支持如:ostream、inserter
  • Forward iterators 读写,前向迭代器。仅仅能前向移动
  • Bidirectional iterators 读写,双向迭代器,可以双向移动。支持如: list、set、map
  • Random access iterators 读写,随机迭代器,可以随机訪问,支持如:vector、deque、string

从功能上看,输入和输出迭代器并列,然后前向迭代器、双向迭代器和随机迭代器之间的关系就类似于类的继承关系。比方。能够将随机訪问迭代器作为双向迭代器或前向迭代器来使用。

举例:

stl 中的 find 函数须要输入迭代器:

template 
inline _InputIter find(_InputIter __first, _InputIter __last, const _Tp& __val, input_iterator_tag){ while (__first != __last && !(*__first == __val)) ++__first; return __first;}

stl 中 的 generate_n 函数须要输出迭代器:

/* The generate_n algorithm traverses the range [first, first + n)   assigning to each element the value returned by gen. Note that generate   modifies  the elements in the specified range.  */template 
_OutputIter generate_n(_OutputIter __first, _Size __n, _Generator __gen) { __STL_REQUIRES(_OutputIter, _OutputIterator); for ( ; __n > 0; --__n, ++__first) *__first = __gen(); return __first;}

stl 中 replace 函数要求前向迭代器:

template 
void replace(_ForwardIter __first, _ForwardIter __last, const _Tp& __old_value, const _Tp& __new_value) { __STL_REQUIRES(_ForwardIter, _Mutable_ForwardIterator); __STL_REQUIRES_BINARY_OP(_OP_EQUAL, bool, typename iterator_traits<_ForwardIter>::value_type, _Tp); __STL_CONVERTIBLE(_Tp, typename iterator_traits<_ForwardIter>::value_type); for ( ; __first != __last; ++__first) if (*__first == __old_value) *__first = __new_value;}

stl 中的 reverse 函数要求双向迭代器:

template 
inline void reverse(_BidirectionalIter __first, _BidirectionalIter __last) { __STL_REQUIRES(_BidirectionalIter, _Mutable_BidirectionalIterator); __reverse(__first, __last, __ITERATOR_CATEGORY(__first));}

stl 中的 sort 函数要求随机訪问迭代器:

template 
inline void sort(_RandomAccessIter __first, _RandomAccessIter __last) { __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator); __STL_REQUIRES(typename iterator_traits<_RandomAccessIter>::value_type, _LessThanComparable); if (__first != __last) { __introsort_loop(__first, __last, __VALUE_TYPE(__first), __lg(__last - __first) * 2); __final_insertion_sort(__first, __last); }}
【原文:http://blog.csdn.net/thisinnocence/article/details/39909787】

你可能感兴趣的文章
图解ARP协议(三)ARP防御篇-如何揪出“内鬼”并“优雅的还手”?
查看>>
设置静态路由的三种方式
查看>>
FastReport.Net报表中使用 Excel 文件作为数据源
查看>>
Stimulsoft Reports.Net基础教程(三):创建主从报表①
查看>>
Java将一段逗号分割的字符串转换成一个数组
查看>>
设计模式之简单工厂模式
查看>>
设置JVM参数,加快eclipse启动
查看>>
OpenStack云计算口袋书-第一章-开始OpenStack之旅(三)
查看>>
运维自动化之Cobbler系统安装详解(1)
查看>>
Mysql基础知识
查看>>
logstash file输入,无输出原因与解决办法
查看>>
C# StringHelper
查看>>
[体感游戏]关于体感游戏的一些思考(五) --- 导航
查看>>
2、Rabbitmq消费者确认机制
查看>>
弹性布局各种坑爹兼容
查看>>
c++ 植物类 继承多态 菱形继承
查看>>
020、Linux性能监控:IO
查看>>
基于fcgI编译安装LAMP实现层次化:httpd 2.4.9 + mysql-5.5.33 + php-5.4.26
查看>>
21、Samba配置详解
查看>>
Eclipse反编译插件 Enhanced Class Decompiler
查看>>