STL_string.vector中find到的iterator的序號


ZC:注意,printf("0x%08X\n",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\n", 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\n", it0, it1);
    int* pi00 = (int*)&it0;
    int* pi01 = (int*)&it1;
    printf("0x%08X - 0x%08X\n", *pi00, *pi01);

    vector<string>::iterator it = std::find(vtr.begin(), vtr.end(), "6");
    if (it == vtr.end())
        printf("it == vtr.end()\n");
    else
    {
        printf("it != vtr.end()\n");
        printf("it : %s\n", it->c_str());
    }

    printf("0x%08X - 0x%08X\n",
        it->c_str(),
        vtr.begin()->c_str() );// ZC: 這里相差 64(十進制)
    printf("0x%08X - 0x%08X\n",
        it,
        it0 );// ZC: 這里相差 40(十進制)

    int iIdx = it - vtr.begin();
    printf("iIdx : it-it0: %d, %d\n", iIdx, (it-it0));
    iIdx = iIdx / sizeof(string);
    printf("iIdx : %d\n", iIdx);
    printf("%d : %s\n", 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、

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM