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、