C++ List Iterators不兼容

Mag*_*igo -1 c++ list

这是我在main.cpp中的代码

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

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

    }
Run Code Online (Sandbox Code Playgroud)

Universe.cpp:

std::list<AbstractBlock*> Universe::getLoadedBlocks(){
    return chunkManager->getLoadedBlocks();
}
Run Code Online (Sandbox Code Playgroud)

CunkManager.cpp:

std::list<AbstractBlock*> ChunkManager::getLoadedBlocks(){
    return loadedBlocks;
}
Run Code Online (Sandbox Code Playgroud)

而loadedBlocks是一个 std::list<AbstractBlock*>

我正在试验列表并第一次尝试它们......我不知道为什么我会收到这个错误

Jam*_*son 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());
}
Run Code Online (Sandbox Code Playgroud)

编辑

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

for (auto& block : universe.getLoadedBlocks())
{
    window.draw(block->draw());
}
Run Code Online (Sandbox Code Playgroud)