此代码有效:
for (unsigned int i = 0; i != m_cResources.getLoadedPlayers().size(); i++) {
m_cResources.getLoadedPlayers()[i]->update();
}
当我尝试使用带有以下代码的迭代器时,我的程序会挂起并停止工作:
for (std::vector<CPlayer*>::iterator i = m_cResources.getLoadedPlayers().begin();
i != m_cResources.getLoadedPlayers().end(); i++) {
(*i)->update();
}
getLoadedPlayers()返回CPlayer *的向量。更新是CPlayer中的成员函数。
我之前从未使用过迭代器所以我不确定是什么问题。我认为错误不在此代码之外,因为第一个块有效。所以我假设我的迭代器实现是错误的。有什么想法吗?
编辑:getLoadedPlayers()按值返回向量,而不是引用。这很可能是问题吗?但那么第一个代码块也不会起作用吗?我会尽快测试一下。
update函数根据先前设置的标志修改CPlayer中的成员值。
答案 0 :(得分:2)
为什么不为每个人使用C ++?
for (auto &i : m_cResources.getLoadedPlayers()) {
i->update();
}
答案 1 :(得分:2)
如果你说getLoadedPlayers()按值返回向量,而不是引用那么第一个循环也没有意义,因为在每次迭代中,在表达式中使用了一个新的向量副本
m_cResources.getLoadedPlayers()[i]->update();
在循环中使用迭代器
for (std::vector<CPlayer*>::iterator i = m_cResources.getLoadedPlayers().begin();
i != .getLoadedPlayerm_cResourcess().end(); i++)
然后迭代器i和getLoadedPlayerm_cResourcess()。end()指向不同的内存范围。所以他们可能不会被比较。
如果你想让你的循环有任何意义,你应该使用对原始向量的引用。
答案 2 :(得分:1)
您的向量是按值返回的,因此在循环的每次迭代中递增的迭代器将永远不会“满足”循环退出条件中的结束迭代器:它属于另一个向量(在每次迭代时更改)。 所以你的代码通过解除引用无效的迭代器(和底层指针)来调用未定义的行为