矢量迭代器在课堂上不兼容

时间:2011-12-12 02:00:41

标签: c++ visual-c++ vector iterator

我有一个非常简单的类,其中vector作为私有变量,如下所示:

#include "Zombie.h"
#include <vector>

class CGame{
public:
CGame();
void DoVectorStuff();
private:
std::vector<Zombie> zombies;
};

在函数DoVectorStuff()中我只是循环遍历向量:

for(std::vector<Zombie>::iterator it = zombies.begin(); it != zombies.end(); ++it)
{
   it->Update(delta);
}

这导致Visual Studio 2010在运行时给我一个调试断言。当它在一个函数中时,相同的代码工作得很好,我假设它与我将它添加到类中有关,但我无法弄清楚是什么。

编辑:http://i.imgur.com/xl6Z6.png这是我遇到的错误。

3 个答案:

答案 0 :(得分:2)

你得到的断言向量迭代器不兼容表明你正在尝试比较来自不同向量的迭代器。

通常你可以通过

获得这些

可能性1

std::vector<int> foo( 100 );
std::vector<int> bar( 100 );

for( std::vector<int>::iterator iter = foo.begin();
    iter != bar.end();
    ++iter )
{
    std::cout << *iter;
}

注意上面的代码,你会注意到我正在比较它是foo vectorbar.end()的迭代器

可能性2

另一种可以获得相同错误的方法是挂在无效的迭代器上。

std::vector<int> foo( 3 );
std::vector<int>::iterator enditer = foo.end();

foo.push_back( 3 );
foo.push_back( 3 );
foo.push_back( 3 );  // can invalidate endIter above


for( std::vector<int>::iterator iter = foo.begin();
    iter != enditer;
    ++iter )
{
    std::cout << *iter;
}

请注意上述代码中我是如何处理 endIter 的,可以通过向 foo 添加更多元素来使其无效

答案 1 :(得分:1)

Wild Guess:Zombie::Update更新了zombies向量,使迭代器it无效。僵尸在Update周期内死亡或复制吗?

答案 2 :(得分:0)

尝试使用

std::vector<Zombie>::iterator

而不是

std::vector::iterator