簡體   English   中英

C ++列表迭代器不兼容

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM