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、

  • 相关阅读:
    Intellij IDEA 配置Tomcat远程调试
    maven学习二(dependencies)
    maven学习一(HelloWorld工程)
    一致性hash在分布式系统中的应用
    理解TCP之Keepalive
    理解HTTP之keep-alive
    TCP/IP,http,socket,长连接,短连接
    图解 HTTP 协议
    PHP开发的一些趣事
    vue
  • 原文地址:https://www.cnblogs.com/cppskill/p/10070579.html
Copyright © 2011-2022 走看看