[英]C++ List Iterators Incompatible
这是我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;
}
并且loadingBlocks是std::list<AbstractBlock*>
我正在尝试使用列表,并首次尝试使用它们...我不确定为什么会出现此错误
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所指出的,假设您使用的是与C ++ 11兼容的编译器,那么您还可以使用更方便/更简洁的基于范围的for循环。
for (auto& block : universe.getLoadedBlocks())
{
window.draw(block->draw());
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.