首頁  >  文章  >  後端開發  >  為什麼從 `std::vector` 中刪除元素時,erase-remove_if 會留下重複對?

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

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-11 20:30:03270瀏覽

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

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

當嘗試使用擦除刪除_if 慣用法從std::vector 中使用消除對時std::pair> 出現了一個特殊的問題。儘管針對 .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 機制:

  • 元素交換: std::remove_if 交換向量內的元素,將所有不匹配的元素推向開頭。匹配的元素最終位於向量的後面。
  • 謂詞迭代: 謂詞 lambda 表達式決定要刪除哪些元素。如果謂詞傳回 true,則對應的元素將會移到向量的末尾。
  • 迭代器檢索: std::remove_if 傳回一個指向與謂詞相符的第一個元素的迭代器;此迭代器標記要刪除的元素的開始。
  • 向量擦除: std::vector::erase 呼叫範圍擦除操作,從傳回的迭代器開始並擴展到向量的結尾。此步驟將從向量中刪除所有符合的元素。

進一步的見解,請參閱關於[刪除刪除習慣用語](https://en.wikipedia.org/) 的維基百科文章wiki/Erase-remove_idiom).

以上是為什麼從 `std::vector` 中刪除元素時,erase-remove_if 會留下重複對?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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