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;
}
C++ STL迭代器与索引相互转换的更多相关文章
- 实战c++中的vector系列--将迭代器转换为索引
		
stl的迭代器非常方便 用于各种算法. 可是一想到vector.我们总是把他当做数组,总喜欢使用下标索引,而不是迭代器. 这里有个问题就是怎样把迭代器转换为索引: #include <vecto ...
 - 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迭代器及迭代器失效问题
		
迭代器失效: 典型的迭代器失效. 首先对于vector而言,添加和删除操作可能使容器的部分或者全部迭代器失效.那为什么迭代器会失效呢?vector元素在内存中是顺序存储,试想:如果当前容器中已经存在了 ...
 - C++: STL迭代器及迭代器失效问题
		
转载至:http://blog.csdn.net/wangshihui512/article/details/9791517 迭代器失效: 典型的迭代器失效. 首先对于vector而言,添加和删除操作 ...
 - C++ STL迭代器原理和简单实现
		
1. 迭代器简介 为了提高C++编程的效率,STL(Standard Template Library)中提供了许多容器,包括vector.list.map.set等.然而有些容器(vector)可以 ...
 
随机推荐
- javascript 模块化模式总结(二)
			
一.对象字面值 这种设计模式中,一个对象被描述为一组以逗号分隔的名称/值对括在大括号({})的集合.对象内部的名称可以是字符串或是标记符后跟着一个冒号":".在对象里最后一个名称/ ...
 - 调试Felix Framework
			
这里是指用Eclipse调试Felix Framework自身. 1. 首先安装Eclipse Java EE,然后再安装Java Source Attacher,这样才会在Jar文件的右键菜单“属性 ...
 - LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror
			
本定义 功能:打开一个动态链接库 包含头文件: #include <dlfcn.h> 函数定义: void * dlopen( const char * pathname, int mod ...
 - Kubuntu 初始配置
			
1.中文配置 系统设置中地区选择中国.语系使用简体中文(一開始可能仅仅有英文选项,似乎是更新后能够选择其它语言了) 安装中文字体: sudo apt-get install ttf-wqy-micro ...
 - 转:【微信小程序】 微信小程序-拍照或选择图片并上传文件
			
调用拍照API:https://mp.weixin.qq.com/debug/wxadoc/dev/api/media-picture.html?t=20161222#wxchooseimageobj ...
 - JavaScript 对象与数组参考大全
			
http://www.cnblogs.com/meil/archive/2006/06/28/437527.html本文列举了各种JavaScript对象与数组,同时包括对上述每一对象或数组所完成工作 ...
 - hibernate 中多对多关系对象集合的保存
			
多对多关系映射和一对多关系映射开发步骤差不多, 例子如下:员工和项目之间的关系,一个员工可以参与多个项目:一个项目可以有多个开发人员参与.因此是多对多的关系. 1 分析数据表 1.1)员工表 CREA ...
 - MS SQL server中的isnull函数
			
一.ISNULL语法格式 ISNULL ( check_expression , replacement_value ) 二.参数简介 check_expression:将被检查是否为 NULL的表达 ...
 - C复杂声明举例
			
首先,一些国外的研究成果: 一个用英语解析复杂声明的网站:http://cdecl.org 图表说明复杂声明(英):http://c-faq.com/decl/spiral.anderson.html ...
 - modelsim仿真中 do文件的写法技巧
			
网上的关于DO文件的编写好像资料不多,比较杂,所以本人总结一下常用的简单语法,方便大家查看.其实本人也刚接触DO文件没多久,有纰漏很正常,欢迎指正批评,互相学习.PS:写得有点乱 还有一个值得注意 ...