to WG_Wolf 你怎么知道不能赋值,你这样试试: vector <classA*>::iterator it = 0;我觉得楼主写出这样的程序:vector <classA*>::iterator it = &vecA[0]; 先不管能过编译与否,说明人家对迭代器的理解还是比较深入的,再比如数组,取一个数组的某个值的写法是: int i = a[10];可是你见过这样的写法吗: int i = 10[a];只有对数组以及编译器对数组的处理理解了,才能写出后面的代码(它是正确的),你不能讽刺人家说“发明有新意”!
vector <classA*>::iterator it = &vecA[0]; 这个写法不能说错误,但也不能说正确.虽然在某些编译器上能编译通过,但编译不过去的编译器也不少.
to akirya vector的迭代器应该是和指针是兼容的,当然这也得看STL库。 但其它的,如list的迭代器就和指针肯定不兼容了。 我也不推荐将指针赋给vector的迭代器。 至于编译不过去,还是哪句话,编译器作者让你过不去就过不去,编译不过去与他们本质上兼容与否或者完全相同与否,都没有必然的联系!
to yang79tao,akirya: 感谢二位的耐心回答,你们丰富的经验帮我解决了棘手的问题,并帮我对STL有了更进一步的认识
如果要用第N个元素,可以:it = vecA.begin() + N;另外:迭代器很不安全,建议在用迭代器时,用一个同步变量保护一下。
------------------------------------------
你的发明很有新意!用迭代器就老老实实从 begin end 开始。
vector的内存结构和数组是兼容的,迭代器的内存结构也和数组元素是兼容的,当然,换其它STL可能会不兼容。关于2005的类型检查的问题,我举个例子,在6.0下,
vector <classA*> vecA;
在需要ClassA*参数的参数中,传一个vecA的迭代器,是可以通过编译的,而在2005下,可能不行,于是处理一下:
vector <classA*>::iterator it = vecA.begin();
fun(&*it);其实从字面上看,&*两个符号在一起,是等于同时去掉两个符号的,但结果是一个可以编译,一个不行。
只能指向内部数据
你只能先解引用,然后再取地址
&*vec.begin();
类似这样的写法得到指针.
你怎么知道不能赋值,你这样试试:
vector <classA*>::iterator it = 0;我觉得楼主写出这样的程序:vector <classA*>::iterator it = &vecA[0];
先不管能过编译与否,说明人家对迭代器的理解还是比较深入的,再比如数组,取一个数组的某个值的写法是:
int i = a[10];可是你见过这样的写法吗:
int i = 10[a];只有对数组以及编译器对数组的处理理解了,才能写出后面的代码(它是正确的),你不能讽刺人家说“发明有新意”!
这个写法不能说错误,但也不能说正确.虽然在某些编译器上能编译通过,但编译不过去的编译器也不少.
vector的迭代器应该是和指针是兼容的,当然这也得看STL库。
但其它的,如list的迭代器就和指针肯定不兼容了。
我也不推荐将指针赋给vector的迭代器。
至于编译不过去,还是哪句话,编译器作者让你过不去就过不去,编译不过去与他们本质上兼容与否或者完全相同与否,都没有必然的联系!
感谢二位的耐心回答,你们丰富的经验帮我解决了棘手的问题,并帮我对STL有了更进一步的认识
没有规定迭代器可以赋值给指针.只是说迭代器的行为跟指针相似.
Iterator是一个类