zoukankan      html  css  js  c++  java
  • STL_string.vector中find到的iterator的序号

    ZC:注意,printf("0x%08X ",vtr.end()); 打印出来 应该就是 0x00000000,∵ 它就是 指向最后一个元素的后面,应该是理解成 无意义     值是0 很合理。

    1、测试代码(以及 我的疑问)

    /*
    ZC:    网上查到,使用vector时,只要将 find到的iterator(itX)减去vector::begin() 就可以得到itX的序号.
    ZC:        但是,原理不明白...  
    ZC:        可靠性 也未有验证,能看到 高手的留言 或者 源码的查证?
    ZC: vector<string>::iterator 的结构不明,iterator的相减到底是什么样的操作,需要看 STL源码??
    //*/
    #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 it0 = vtr.begin();
        vector<string>::iterator it1 = vtr.end();
        printf("0x%08X - 0x%08X , 0x%08X - 0x%08X , 0x%08X - 0x%08X
    ", it0, it1);
        int* pi00 = (int*)&it0;
        int* pi01 = (int*)&it1;
        printf("0x%08X - 0x%08X
    ", *pi00, *pi01);
    
        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
    ",
            it,
            it0 );// ZC: 这里相差 40(十进制)
    
        int iIdx = it - vtr.begin();
        printf("iIdx : it-it0: %d, %d
    ", iIdx, (it-it0));
        iIdx = iIdx / sizeof(string);
        printf("iIdx : %d
    ", iIdx);
        printf("%d : %s
    ", iIdx, vtr.at(iIdx).c_str());
    //*/
        system("pause");
    }

    2、控制台输出

    32
    0x0019FD6C - 0x00000000 , 0x006579E0 - 0x0019FD6C , 0x0019FD58 - 0x00657A80
    0x0019FD6C - 0x0019FD6C
    it != vtr.end()
    it : 6
    0x00657A28 - 0x006579E8
    iIdx : it-it0: 2, 2
    iIdx : 0
    0 : 8
    请按任意键继续. . .

    3、

    4、

    5、

  • 相关阅读:
    事务创建函数
    实现Xshell断开连接情况下Linux命令继续执行
    MySQL UNION 操作符
    CentOS安装部署Mysql 5.7
    连接数据库
    @Results用法总结
    在Java中如何高效的判断数组中是否包含某个元素
    Java中的map集合顺序如何与添加顺序一样
    instanceof的用法
    枚举
  • 原文地址:https://www.cnblogs.com/cppskill/p/9305379.html
Copyright © 2011-2022 走看看