遍历矢量会导致错误,但循环的标准不会
Iterating through a vector cause error but standard for-loop does not
我有一个vector
,它保存指向抽象类型Rock
:的指针
vector<Rock*> rocks;
如果我用迭代器循环遍历向量,然后尝试通过迭代器访问对象(一个扩展Rock
的非抽象类),我会在XCode 4:中得到一个"EXC_BAD_access"错误
vector<Rock*>::iterator rockIter;
for (rockIter = rocks.begin(); rockIter != rocks.end(); ++rockIter)
{
bullet.hit(*(*rockIter));
}
但正常情况下循环通过它是没有问题的:
for (int i = 0; i < rocks.size(); i++)
{
bullet.hit(*rocks[i]);
}
函数hit()
看起来像:
bool Bullet::hit(Rock & rock)
我以为*(*rockIter)
和*rock[i]
会做同样的事情,但显然他们不会。有什么不同,我如何像使用*rock[i]
那样通过迭代器传递向量中对象的引用?
在没有看到更多代码的情况下,我不确定这是否是问题所在,但bullet.hit()
中的代码是否通过添加元素来改变矢量?如果是,并且您正在使用iterator
对其进行迭代,则该迭代器将失效,并且将来对它的任何取消引用都将导致未定义的行为。然而,使用标准的基于int
的for循环不会有这个问题,因为通过索引进行的访问不能无效。
希望这能有所帮助!
相关文章:
- 将手写循环转换为标准库调用
- 循环遍历标准的正确方法::array<char*, N>
- 标准::列表是循环的吗?
- 无法循环访问标准::地图
- 使用标准库将循环替换为 strtok
- 关于循环变量优化的标准合规行为是什么?
- 标准容器封装和基于范围的 for 循环
- 在C++标准中,当我同时使用 list.begin() 作为 list.splice() 的第一个和第三个参数时,为什么会发生无限循环
- 我怎样才能打破这个标准::shared_ptr参考循环
- 标准库中的双链接循环列表
- Getline 在将文件重定向到标准输入时会导致无限循环
- 标准::队列的基于范围的循环
- 对于循环与标准::for_each与 lambda
- 标准输入,而循环不会退出 c++
- 标准模板库列表 - 双重链接或循环链接
- 使用for_each标准或提升工具优化循环
- 遍历矢量会导致错误,但循环的标准不会
- <iostream> 标准:函数内的cout不打印(修复:用于循环问题)
- For循环与标准库算法与相对较旧的编译器
- 通过只循环一次来组合c++标准算法