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:但它是指针的向量,并且他正在通过取消引用的指针调用函数,所以应该可以正常工作。当然,如果函数通过引用返回向量会更好。