STL.vector.iterator的序号
Posted cppskill
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL.vector.iterator的序号相关的知识,希望对你有一定的参考价值。
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 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 itBegin = vtr.begin(); vector<string>::iterator itEnd = vtr.end(); printf("0x%08X - 0x%08X ", itBegin, itEnd); int* piBegin = (int*)&itBegin; int* piEnd = (int*)&itEnd; printf("0x%08X - 0x%08X ", *piBegin, *piEnd); 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 = %d(10进制) ", it, itBegin, (it-itBegin) );// ZC: 这里相差 40(十进制) int iIdx = it - vtr.begin(); printf("iIdx : %d, it-it0: %d ", iIdx, (it-itBegin)); iIdx = iIdx / sizeof(string); printf("iIdx : %d ", iIdx); printf("%d : %s ", iIdx, vtr.at(iIdx).c_str()); //*/ system("pause"); }
3、
4、
5、
以上是关于STL.vector.iterator的序号的主要内容,如果未能解决你的问题,请参考以下文章