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、