0 前言

C++ STL提供了vector、list等模板容器,极大地方便了编程使用。

“遍历”是对容器使用的最常用的操作。

使用迭代器来遍历是最好最高效的遍历方法。

当然,对于有些容器的遍历除了使用迭代器,还可以使用传统的索引来遍历。

在实际编程中,需要迭代器和索引同时使用,混合编程,就难免会涉及到迭代器和索引之间的相互转换。

转换主要是使用STL中的advancedistance函数来进行的,

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迭代器与索引相互转换的更多相关文章

  1. 实战c++中的vector系列--将迭代器转换为索引

    stl的迭代器非常方便 用于各种算法. 可是一想到vector.我们总是把他当做数组,总喜欢使用下标索引,而不是迭代器. 这里有个问题就是怎样把迭代器转换为索引: #include <vecto ...

  2. STL迭代器笔记

    STL迭代器简介 标准模板库(The Standard Template Library, STL)定义了五种迭代器.下面的图表画出了这几种: input         output \       ...

  3. 一步一步的理解C++STL迭代器

    一步一步的理解C++STL迭代器 "指针"对全部C/C++的程序猿来说,一点都不陌生. 在接触到C语言中的malloc函数和C++中的new函数后.我们也知道这两个函数返回的都是一 ...

  4. STL 迭代器 iterator const

    STL迭代器很多时候可以当成指针来使用. 但是指针一般可以用const来控制访问. 那迭代器呢. #include <iostream> #include <vector> u ...

  5. STL迭代器的使用、正向、逆向输出双向链表中的所有元素

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  6. 【STL 源码剖析】浅谈 STL 迭代器与 traits 编程技法

    大家好,我是小贺. 点赞再看,养成习惯 文章每周持续更新,可以微信搜索「herongwei」第一时间阅读和催更,本文 GitHub : https://github.com/rongweihe/Mor ...

  7. STL迭代器及迭代器失效问题

    迭代器失效: 典型的迭代器失效. 首先对于vector而言,添加和删除操作可能使容器的部分或者全部迭代器失效.那为什么迭代器会失效呢?vector元素在内存中是顺序存储,试想:如果当前容器中已经存在了 ...

  8. C++: STL迭代器及迭代器失效问题

    转载至:http://blog.csdn.net/wangshihui512/article/details/9791517 迭代器失效: 典型的迭代器失效. 首先对于vector而言,添加和删除操作 ...

  9. C++ STL迭代器原理和简单实现

    1. 迭代器简介 为了提高C++编程的效率,STL(Standard Template Library)中提供了许多容器,包括vector.list.map.set等.然而有些容器(vector)可以 ...

随机推荐

  1. docker sshd image problem, session required pam_loginuid.so, cann't login

    在使用sshd docker 镜像时, 发现一个比较诡异的问题, 有些启动的容器可以连接, 有些不能. 例如 :  启动2个容器(这两个容器都有问题) :  [root@localhost ~]# d ...

  2. SpringMVC与SiteMesh

    SpringMVC与SiteMesh2.4无缝整合并借助JSR303规范实现表单验证 SiteMesh3.0的下载,简介与使用 总结: springmvc结合sitemesh总共分三步: 1.添加si ...

  3. web普通项目映射为maven项目

    localhost:8080/yourWebLocation  访问 前一个插件是映射项目路径成maven的格式 后一个插件是映射访问网址所需要的东西 <build> <!-- 发布 ...

  4. 【LeetCode】94. Binary Tree Inorder Traversal (3 solutions)

    Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' values ...

  5. JavaScript 中 substr 和 substring的区别

    http://www.cnblogs.com/meil/archive/2007/01/05/598528.htmlString.substr(N1,N2) 这个就是我们常用的从指定的位置(N1)截取 ...

  6. Linux命令-目录处理命令:mkdir

    mkdir /tmp/beijing mkdir -p /tmp/shijiazhuang/yuhuaqu 一条命令可以同时创建父目录和子目录 mkdir /tmp/beijing/chaoyangq ...

  7. Linux命令格式

  8. FPGA的EPCS 配置的2种方法 FPGA下载程序的方法(EPCS)

    使用主动串行配置模式对Cyclone FPGA进行配置前,必须将配置文件写入串行配置器件EPCS.将配置文件写入EPCS的方法有三种: (1)在Quartus II的Programmer中,通过专门与 ...

  9. C#-拷贝目录内容(文件和子目录)

    /// <summary> /// 拷贝目录内容 /// </summary> /// <param name="source">源目录< ...

  10. Locust分布式负载测试工具入门

    忽略元数据末尾 回到原数据开始处 Locust简介 Locust是一个简单易用的分布式负载测试工具,主要用来对网站进行负载压力测试. 以下是github上的仓库地址 https://github.co ...