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、

原文地址:https://www.cnblogs.com/cppskill/p/9305379.html