首頁  >  文章  >  後端開發  >  為什麼我的 Erase-Remove_If 程式碼會留下重複?

為什麼我的 Erase-Remove_If 程式碼會留下重複?

Barbara Streisand
Barbara Streisand原創
2024-11-10 14:33:02986瀏覽

Why Is My Erase-Remove_If Code Leaving Duplicates?

Erase-Remove_If 慣用法:正確應用

erase-remove_if 慣用法是一種通用技術,用於基於謂詞。然而,不正確的實現可能會導致意外的結果。

在給定的範例中,您的目標是使用erase-remove_if 從對向量中刪除 .first 值為 4 的對。然而你的程式碼卻留下了重複的內容,說明有錯誤。

正確的程式碼應該是:

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 交換向量中的元素,將與開頭的謂詞不符的元素分組。然後它返回一個迭代器到第一個要刪除的元素,標記要保留和刪除的元素之間的分隔。

std::vector::erase 從傳回的迭代器開始並擦除所有後續元素,有效地刪除與謂詞相符的所有元素。

在最初的程式碼中,您省略了 std::erase 的第二個參數,導致僅刪除傳回的迭代器指示的元素。這導致了重複,因為與謂詞相符的後續元素沒有被刪除。

透過包含第二個參數 stopPoints.end(),我們指示擦除刪除從傳回的迭代器開始到迭代器末端的範圍。向量,確保刪除所有匹配元素。

有關擦除刪除習慣用法的更全面信息,請參閱維基百科條目:https://en.wikipedia.org/wiki/Erase–remove_idiom

以上是為什麼我的 Erase-Remove_If 程式碼會留下重複?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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