繁体   English   中英

我如何错误地使用向量迭代器?

[英]How am I using vector iterators incorrectly?

此代码有效:

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()返回值的向量,而不是引用。 这很可能是问题所在吗? 但是,第一个代码块也不会起作用吗? 我将尽快对此进行测试。

更新功能根据先前设置的标志修改CPlayer中的成员值。

为什么不为每个使用C ++?

for (auto &i : m_cResources.getLoadedPlayers()) {
  i->update();
}

如果如您所说,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()指向不同的内存范围。 因此它们可能无法比较。

如果您希望循环有任何意义,则应使用对原始向量的引用。

向量是按值返回的,因此在循环的每次迭代中递增的迭代器永远不会在循环退出条件下“满足”最终迭代器:它属于另一个向量(每次迭代都更改)。 因此,您的代码通过取消引用无效的迭代器(和基础指针)来调用未定义的行为

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM