」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼從 `std::vector` 中刪除元素時,erase-remove_if 會留下重複對?

為什麼從 `std::vector` 中刪除元素時,erase-remove_if 會留下重複對?

發佈於2024-12-23
瀏覽:110

Why does erase-remove_if leave behind duplicate pairs when removing elements from a `std::vector`?

用於刪除對的Erase-Remove_if 慣用語

當嘗試使用Erase-remove_if 慣用語從std::vector> 出現了一個特殊的問題。儘管要刪除的目標對的 .first 值為 4,但初始實作留下了重複的對:

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [&](const stopPointPair stopPoint)-> bool { return stopPoint.first == 4; }));

問題的根源在於擦除過程不徹底。 std::erase_if 僅將匹配元素移至向量末尾;它不會刪除它們。要完成刪除,正確的做法是使用 std::remove_if 傳回的迭代器作為擦除的起點:

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [](const stopPointPair stopPoint)-> bool 
                                       { return stopPoint.first == 4; }), 
                 stopPoints.end());

理解Erase-Remove_if 機制:

  • 理解Erase-Remove_if 機制:
  • 元素交換: std::remove_if 交換元素在向量內,將所有不匹配的元素推向開頭。匹配的元素最終位於向量的後面。
  • 謂詞迭代: 謂詞 lambda 表達式決定要刪除哪些元素。如果謂詞傳回 true,則對應的元素將會移到向量的末尾。
  • 迭代器檢索: std::remove_if 傳回一個指向與謂詞相符的第一個元素的迭代器;此迭代器標記要刪除的元素的開始。

Vector Erasure: std::vector::erase 呼叫範圍擦除操作,從傳回的迭代器開始並擴展到向量的結尾。此步驟將從向量中刪除所有符合的元素。

進一步的見解,請參閱有關 Why does erase-remove_if leave behind duplicate pairs when removing elements from a `std::vector`? 
[Erase-Remove Idiom](https://en.wikipedia.org/ wiki/Erase-remove_idiom)

.

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3