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中文網其他相關文章!