C++ 如何错误地使用向量迭代器?
此代码适用于:C++ 如何错误地使用向量迭代器?,c++,vector,iterator,C++,Vector,Iterator,此代码适用于: 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().
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();
}
for(std::vector::iterator i=m_cResources.getLoadedPlayer().begin();
i!=m_cResources.getLoadedPlayer().end();i++){
(*i)->update();
}
getLoadedPlayer()返回cLayer*的向量。更新是CPlayer中的一个成员函数
我以前从未使用过迭代器,所以我真的不确定哪里出了问题。我不认为这个错误超出了代码的范围,因为第一个块可以工作。所以我假设迭代器的实现是错误的。有什么想法吗
编辑:getLoadedPlayer()按值返回向量,而不是按引用返回。这很可能是问题所在吗?但是第一个代码块不是也不起作用吗?我会尽快测试这个
update函数根据先前设置的标志修改CPlayer中的成员值。为什么不为每个成员使用C++
for (auto &i : m_cResources.getLoadedPlayers()) {
i->update();
}
为什么不分别使用C++呢
for (auto &i : m_cResources.getLoadedPlayers()) {
i->update();
}
如果如您所说,getLoadedPlayer()通过值而不是引用返回向量,那么第一个循环也没有意义,因为在每次迭代中,表达式中使用了向量的新副本
m_cResources.getLoadedPlayers()[i]->update();
在循环中使用迭代器时
for (std::vector<CPlayer*>::iterator i = m_cResources.getLoadedPlayers().begin();
i != .getLoadedPlayerm_cResourcess().end(); i++)
for(std::vector::iterator i=m_cResources.getLoadedPlayer().begin();
i!=.getLoadedPlayerm_cResourcess().end();i++)
然后迭代器i和getLoadedPlayerm_cResourcess().end()指向不同的内存范围。因此,它们可能无法进行比较
如果希望循环具有任何意义,则应使用对原始向量的引用。如果如您所说的GetLoadedPlayer()通过值而不是引用返回向量,则第一个循环也没有意义,因为在每次迭代中,表达式中使用了向量的新副本
m_cResources.getLoadedPlayers()[i]->update();
在循环中使用迭代器时
for (std::vector<CPlayer*>::iterator i = m_cResources.getLoadedPlayers().begin();
i != .getLoadedPlayerm_cResourcess().end(); i++)
for(std::vector::iterator i=m_cResources.getLoadedPlayer().begin();
i!=.getLoadedPlayerm_cResourcess().end();i++)
然后迭代器i和getLoadedPlayerm_cResourcess().end()指向不同的内存范围。因此,它们可能无法进行比较
如果希望循环具有任何意义,则应使用对原始向量的引用。向量由值返回,因此每次循环迭代递增的迭代器在循环退出条件下永远不会“满足”结束迭代器:它属于另一个向量(在每次迭代时更改)。
因此,您的代码通过取消引用无效的迭代器(以及底层指针)来调用未定义的行为。您的向量是通过值返回的,因此每次循环迭代递增的迭代器在循环退出条件下永远不会“满足”结束迭代器:它属于另一个向量(每次迭代时都会更改)。
因此,您的代码通过取消引用无效的迭代器(和底层指针)来调用未定义的行为。在
CPlayer::update
中执行任何操作,修改getLoadedPlayer()返回的向量。
(因此可能会使迭代器无效)?和样式说明:对于迭代器,更喜欢++i
而不是i++
。GetLoadedPlayer
是通过引用还是通过值返回向量?@JoeZ:不仅仅是样式,也是一个效率问题。@EduardoLeón:没错。CPlayer::update
中是否有任何内容修改GetLoadedPlayer()返回的向量。
(因此可能使迭代器无效)?样式说明:迭代器更喜欢++i
而不是i++
。getLoadedPlayer
是通过引用还是通过值返回向量?@JoeZ:不仅仅是样式,也是一个效率问题。@EduardoLeón:足够正确。如果问题是通过值返回,那么update()是为了在对象中产生持久的效果,那么上述方法就不能解决真正的问题。建议不错。有点吹毛求疵:向量的元素本身就是指针,所以应该是i->update()当然,它确实需要C++11的支持,不幸的是,这还不是无处不在的。@Cheersandhth.-Alf这就是为什么要使用reference&i
。即使如此,它也不是必需的,因为这些都是指针。所以方法update
无论如何都会在原始对象上执行。@Cheersandhth.-Alf:但它是指针的向量,并且他正在通过取消引用的指针调用函数,因此应该可以正常工作。当然,如果函数通过引用返回向量会更好。如果问题是通过值返回,并且如果update()是为了在对象中产生持久的效果,那么上述方法就不能解决真正的问题。建议不错。有点吹毛求疵:向量的元素本身就是指针,所以应该是i->update()当然,它确实需要C++11的支持,不幸的是,这还不是无处不在的。@Cheersandhth.-Alf这就是为什么要使用reference&i
。即使如此,它也不是必需的,因为这些都是指针。所以方法update
无论如何都会在原始对象上执行。@Cheersandhth.-Alf:但它是指针的向量,并且他正在通过取消引用的指针调用函数,所以应该可以正常工作。当然,如果函数通过引用返回向量会更好。