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

时间:2013-12-11 02:38:01

标签: 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().begin();
        i != m_cResources.getLoadedPlayers().end(); i++) {
    (*i)->update();
}

getLoadedPlayers()返回CPlayer *的向量。更新是CPlayer中的成员函数。

我之前从未使用过迭代器所以我不确定是什么问题。我认为错误不在此代码之外,因为第一个块有效。所以我假设我的迭代器实现是错误的。有什么想法吗?

编辑:getLoadedPlayers()按值返回向量,而不是引用。这很可能是问题吗?但那么第一个代码块也不会起作用吗?我会尽快测试一下。

update函数根据先前设置的标志修改CPlayer中的成员值。

3 个答案:

答案 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)

您的向量是按值返回的,因此在循环的每次迭代中递增的迭代器将永远不会“满足”循环退出条件中的结束迭代器:它属于另一个向量(在每次迭代时更改)。 所以你的代码通过解除引用无效的迭代器(和底层指针)来调用未定义的行为