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)可以 ...
随机推荐
- oracle 导入Excel数据
oracle 导入excel数据 CreateTime--2018年1月30日14:58:51 Author:Marydon 通过plsql实现 1.准备工作 Excel中的字段名称,必须和表结构 ...
- 使用 Python 的 matplotlib 绘图库进行绘图
matplotlib 是 Python 最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 1 使用 Ma ...
- Prototype的深度探索
http://www.cnblogs.com/meil/archive/2007/06/06/773645.html 1 什么是prototype JavaScript中对象的prototype属性, ...
- Python -- 标准库 文件管理 (部分os包,shutil包)
在操作系统下,用户可以通过操作系统的命令来管理文件,参考linux文件管理相关命令.Python标准库则允许我们从Python内部管理文件.相同的目的,我们有了两条途径.尽管在Python调用标准库的 ...
- 用ASP.NET/C#连接Access和SQL Server数据库
连接Access 首先看一个例子代码片断:程序代码: ------------------------------------------------------------------------- ...
- 变动性算法源代码分析与使用示例(copy_backward、 transform、 replace_copy_if 等)
首先回顾前面的文章,我们把for_each 归类为非变动性算法,实际上它也可以算是变动性算法,取决于传入的第三个参数,即函数 指针.如果在函数内对容器元素做了修改,那么就属于变动性算法. 变动性算法源 ...
- vector 类简介和例程
一.标准库的vector类型 vector是同一种类型的对象的集合 vector的数据结构很像数组,能非常高效和方便地访问单个元素 vector是一个类模板(class template) vecto ...
- appium 1.6.3 + ios 10.2 + xcode 8.2.1 真机运行safari
启动appium 命令: appium --address "127.0.0.1" --session-override --pre-launch --debug-log-spac ...
- Node.js验证码模块captchapng
captchapng是一个基于pnglib模块开发,数字型验证码模块.内置字体.全JavaScript无其它依赖.不像有的验证码需要依赖canvas或者是需要编译,而且captchapng使用起来简单 ...
- 自定义控件VS用户控件
自定义控件VS用户控件 2015-06-16 1 自定义控件与用户控件区别 WinForm中, 用户控件(User Control):继承自 UserControl,主要用于开发 Container ...