概述
for (vector<Apple*>::iterator iter = vec.begin(); iter != vec.end(); iter++) {
s += (*iter[0])(x); //两句话是一样的
// s += iter[0]->operator()(x);
}
假设有一个类Apple,内部声明了一个成员函数operator(),也就是重载了(),有一个Vector<Apple*>的实例vec,现直接把迭代器iterator用在循环体内调用该成员函数,出现了有趣的现象。原以为iterator本质上就是一个地址。没想到竟然可以访问iter[0],iter[1]。而iter[0]=iter此刻指向元素的地址。iter[1] 是下一个元素的地址。
如果写成了s += (*iter)(x) 或者 s += iter->operator()(x) , 编译器(vs2015)反而会直接提示错误。下面是不同写法编译器产生的不同提示:
------------------------------------------------------------------------------------------------------------
s += *iter(x);
------------------------------------------------------------------------------------------------------------
s += (*iter)(x);
// 或者
s += *iter[0](x);
------------------------------------------------------------------------------------------------------------
s += (*iter[0])(x);
这样才是正确的.
------------------------------------------------------------------------------------------------------------
s += iter->operator()(x);
------------------------------------------------------------------------------------------------------------
s += iter[0]->operator()(x);
这样才是正确的.
------------------------------------------------------------------------------------------------------------
这个特性不禁让人感觉奇怪。今天就先探索到此处吧。日后有时间还会继续调查或者哪位大神愿意解答这个现象请留言。非常感谢!
P.S. 因此为了避免这种奇怪的现象,还是直接采用for (int i = 0; i < vec.size(); i++) 来遍历访问vec吧(逃避可耻hh)。
最后
以上就是疯狂冰棍为你收集整理的当容器的元素是类指针时,迭代器本质是什么?的全部内容,希望文章能够帮你解决当容器的元素是类指针时,迭代器本质是什么?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复