C++ STL迭代器与索引相互转换
0 前言
C++ STL提供了vector、list等模板容器,极大地方便了编程使用。
“遍历”是对容器使用的最常用的操作。
使用迭代器来遍历是最好最高效的遍历方法。
当然,对于有些容器的遍历除了使用迭代器,还可以使用传统的索引来遍历。
在实际编程中,需要迭代器和索引同时使用,混合编程,就难免会涉及到迭代器和索引之间的相互转换。
转换主要是使用STL中的advance和distance函数来进行的,
advance是将iterator移动指定个元素,distance是计算两个iterator直接的距离。
1 distance与advance
distance计算第一个参数到第二个参数之间的距离。如果第二个参数的顺序在第一个参数前面的话,函数是会返回负值的;如果迭代器不在一个容器内,程序会抛出异常。
Determines the number of increments between the positions addressed by two iterators.
template<class InputIterator>
typename iterator_traits<InputIterator>::difference_type
distance(
InputIterator _First,
InputIterator _Last
);
advance是将第一个参数向后移动第二个参数指定个元素。如果第二个参数为负,则向前移动;如果向前或向后移动超出容器范围,则抛出异常。
Increments an iterator by a specified number of positions.
template<class InputIterator, class Distance>
void advance(
InputIterator& _InIt,
Distance _Off
);
2 distance与advance使用
#include <iostream>
#include <list>
#include
using namespace std;
int main()
{
list mylist;
for (int i = 0; i < 10; i++)
{
mylist.push_back (i * 10.0);
}
list::iterator itfirst = mylist.begin();
list::iterator itlast = mylist.end();
advance(itfirst, 1);
cout << "The distance is: " << distance(itfirst, itlast) << endl;
return 0;
}
附录:写了两个工具函数
inline const int iterator_to_index(MYARRAY &a, MYARRAY::iterator it)
{
return (int)distance(it - a.begin());
}
inline const MYARRAY::iterator index_to_iterator (MYARRAY &a, int nIndex)
{
MYARRAY::iterator it = a.begin();
Advance(it, nIndex);
return it;
}
最新文章
- UITableViewController和XML解析还有地图的简单结合
- Mac iTerm 很好用的终端
- ViewState提交后丢失,竟然是OnInit搞的鬼
- XidianOJ 1195 Industry of Orz Pandas
- 【Oracle】配置oracle数据库最大连接数
- poj 1035 Spell checker
- mysql update中需要根据条件列更新写法update case
- ThinkPHP3.2 行为扩展以及插件机制介绍!
- DNSPod各个套餐的DNS地址
- C++中实现回调机制的几种方式(一共三种方法,另加三种)
- Linux lsof命令详解和使用示例【转】
- jdk,tomcat配置
- C语言的字符串操作函数小结
- Scala安装教程
- P3374 【模板】树状数组 1--洛谷luogu
- jsp传Array数组到后台
- AtomicInteger和count++的比较
- [No0000189]改善C#程序的建议10:用Parallel简化Task
- 侯捷STL课程及源码剖析学习1
- Python练习笔记——计算输入日期为改年的第几天、星期几
热门文章
- DBCP( 二) DataBase Connection Pool 的使用
- 用python实现的的手写数字识别器
- 简述document.write和 innerHTML的区别。
- ASP.NET Web API 控制器执行过程
- Python 列表 min() 方法
- NPN/PNP和N沟道/P沟道负载的接法
- Sublime Text 使用指南 - 前端开发神器
- Docker搭建本地私有仓库
- Leetcode[81]-Search for a Range
- Machine Learning—The k-means clustering algorithm