STL.vector.iterator的序號
阿新 • • 發佈:2018-12-05
!= 獲取 isa 顯示 string map code 解釋 stl源碼
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 namespacestd; 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 itBegin = vtr.begin(); vector<string>::iterator itEnd = vtr.end(); printf("0x%08X - 0x%08X\n", itBegin, itEnd); int* piBegin = (int*)&itBegin; int* piEnd = (int*)&itEnd; printf("0x%08X - 0x%08X\n", *piBegin, *piEnd); 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 = %d(10進制)\n", it, itBegin, (it-itBegin) );// ZC: 這裏相差 40(十進制) int iIdx = it - vtr.begin(); printf("iIdx : %d, it-it0: %d\n", iIdx, (it-itBegin)); iIdx = iIdx / sizeof(string); printf("iIdx : %d\n", iIdx); printf("%d : %s\n", iIdx, vtr.at(iIdx).c_str()); //*/ system("pause"); }
3、
4、
5、
STL.vector.iterator的序號