首頁 >後端開發 >C++ >如何在 C 循環中安全地從向量中刪除元素?

如何在 C 循環中安全地從向量中刪除元素?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-10 03:55:21979瀏覽

How to Safely Remove Elements from a Vector in a C   Loop?

在循環內從向量中刪除元素

使用向量時的一個常見任務是根據其屬性刪除特定元素。但是,在迭代向量時更新向量可能會導致意外錯誤。

讓我們考慮以下程式碼片段:

for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); it++) {
    if (it->getpMoney() <= 0)
        it = allPlayers.erase(it);
    else
        ++it;
}

此程式碼旨在從零或更少金錢的玩家中刪除所有玩家向量。然而,執行此程式碼通常會導致錯誤訊息:

'operator =' function is unavailable in 'Player'

錯誤原因:

出現這個錯誤是因為std::vector::erase 內部使用賦值運算子(=)來移動向量內的元素。要使用擦除,Player 類別必須實作賦值運算子。

不使用賦值運算子的解決方案:

要避免賦值運算子要求,請註解掉循環:

for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); /*it++*/) {
    if (it->getpMoney() <= 0)
        it = allPlayers.erase(it);
}

透過刪除it增量,迭代器在每次擦除後自動前進

使用Erase-Remove Idiom 進行重構:

更簡潔的解決方案是使用Erase-Remove Idiom,它提供了一種簡潔有效的方法來從向量:

allPlayers.erase(
    std::remove_if(
        allPlayers.begin(),
        allPlayers.end(),
        [](Player const & p) { return p.getpMoney() <= 0; }
    ),
    allPlayers.end()
);

在這種方法中,std::remove_if 根據提供的篩選向量拉姆達表達式。然後使用 std::vector::erase 刪除過濾後的元素。

以上是如何在 C 循環中安全地從向量中刪除元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn