C ++ List Iterators不兼容

时间:2015-07-04 06:11:28

标签: c++ list

这是我在main.cpp中的代码

std::list<AbstractBlock*>::iterator i;

    for (i = universe.getLoadedBlocks().begin(); i != universe.getLoadedBlocks().end(); i++){
        window.draw((*i)->draw());

    }

Universe.cpp:

std::list<AbstractBlock*> Universe::getLoadedBlocks(){
    return chunkManager->getLoadedBlocks();
}

CunkManager.cpp:

std::list<AbstractBlock*> ChunkManager::getLoadedBlocks(){
    return loadedBlocks;
}

且loadedBlocks是std::list<AbstractBlock*>

我正在尝试使用列表并第一次尝试使用它们...我不确定为什么我会收到此错误

1 个答案:

答案 0 :(得分:6)

std::list<AbstractBlock*> Universe::getLoadedBlocks() { ... }
^^^^^^^^^^^^^^^^^^^^^^^^^ // This returns a copy of the list

因此,universe.getLoadedBlocks().begin()使用列表的一个副本,universe.getLoadedBlocks().end()使用列表的不同副本。这就是迭代器不兼容的原因(即它们来自不同的列表)。

换句话说,一个列表实例的begin迭代器永远不会等于来自不同列表实例的end迭代器。

如果您不更改getLoadedBlocks()功能,可以尝试:

std::list<AbstractBlock*> values = universe.getLoadedBlocks();
for (i = values.begin(); i != values.end(); i++) // Note: You should use ++i here (for possible efficiency benefits)
{
    window.draw((*i)->draw());
}

修改

正如Jarod42指出的那样,你也可以使用更方便/简洁的基于范围的for循环,假设你使用的是兼容C ++ 11的编译器。

for (auto& block : universe.getLoadedBlocks())
{
    window.draw(block->draw());
}