当容器的元素是类指针时,迭代器本质是什么?

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)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值