zoukankan      html  css  js  c++  java
  • STL.vector.iterator的序号

    ZC:网上查到,使用vector时,只要将 find到的iterator(itX)减去vector::begin() 就可以得到itX的序号.

    1、需求:得到 某个 iterator在 vector中是第几个(即 获取序号)

    2、测试代码:(Win7x64,vs08x86)

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    
    #include <io.h>
    
    #include <map>
    #include <math.h>
    #include <list>
    #include <string>
    #include <sstream>
    #include <algorithm>// std::find(...)
    #include <vector>
    using namespace std;
    
    //#include "stdafx.h"
    #include <iostream>
    #include <windows.h>
    #include <math.h>
    using namespace std;
    
    
    /*
    ZC:    网上查到,使用vector时,只要将 find到的iterator(itX)减去vector::begin() 就可以得到itX的序号.
    ZC:        但是,原理不明白...  
    ZC:        可靠性 也未有验证,能看到 高手的留言 或者 源码的查证?
    ZC: vector<string>::iterator 的结构不明,iterator的相减到底是什么样的操作,需要看 STL源码??
    //*/
    // ZC: 估计是 iterator中 有重载 减号操作符?使得 在用于vector的时候,详见能够得到 序号?
    
    #pragma warning(disable:4996)
    #pragma warning(disable:4786)// ZC: 貌似VC6使用map的时,在build的时候会报很多warning,用这个 禁止显示这些warning
    #include <map>
    #include <string>
    #include <algorithm>// std::find(...)
    #include <vector>
    using namespace std;
    
    void main()
    {
        vector<string> vtr;
        vtr.push_back("8");
        vtr.push_back("2");
        vtr.push_back("6");
        vtr.push_back("7");
        vtr.push_back("1");
        printf("%d
    ", sizeof(string));
    
      // ZC: 这里想用地址 来看看:是否 两个iterator的地址之差 和 idx 有什么联系,但是 没找到什么联系,估计还是得看源码 或者 别人的解释
        vector<string>::iterator itBegin = vtr.begin();
        vector<string>::iterator itEnd = vtr.end();
        printf("0x%08X - 0x%08X
    ", itBegin, itEnd);
        int* piBegin = (int*)&itBegin;
        int* piEnd = (int*)&itEnd;
        printf("0x%08X - 0x%08X
    ", *piBegin, *piEnd);
    
        vector<string>::iterator it = std::find(vtr.begin(), vtr.end(), "6");
        if (it == vtr.end())
            printf("it == vtr.end()
    ");
        else
        {
            printf("it != vtr.end()
    ");
            printf("it : %s
    ", it->c_str());
        }
    
        printf("0x%08X - 0x%08X
    ",
            it->c_str(),
            vtr.begin()->c_str() );// ZC: 这里相差 64(十进制)
        printf("0x%08X - 0x%08X = %d(10进制)
    ",
            it, itBegin, (it-itBegin) );// ZC: 这里相差 40(十进制)
    
        int iIdx = it - vtr.begin();
        printf("iIdx : %d, it-it0: %d
    ", iIdx, (it-itBegin));
        iIdx = iIdx / sizeof(string);
        printf("iIdx : %d
    ", iIdx);
        printf("%d : %s
    ", iIdx, vtr.at(iIdx).c_str());
    //*/
        system("pause");
    }

    3、

    4、

    5、

  • 相关阅读:
    linux命令之------Linux文档编辑
    linux命令之------Linux文件系统具体目录
    linux命令之------快捷键说明
    linux命令之------Tar解压缩
    CentOS7如何关闭防火墙
    centos7中运行ifconfig提示-bash: ifconfig: command not found
    System.getProperty、PropConfig.loadConfig应用
    Java高并发syncronized深入理解
    json的工具以及浏览器排序问题
    Mockito: InvalidUseOfMatchersException
  • 原文地址:https://www.cnblogs.com/cppskill/p/10070579.html
Copyright © 2011-2022 走看看