首頁  >  文章  >  後端開發  >  為什麼使用 Erase-Remove_if 習慣用法從向量中刪除元素不能如預期般運作?

為什麼使用 Erase-Remove_if 習慣用法從向量中刪除元素不能如預期般運作?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-16 15:01:02756瀏覽

Why Does Using the Erase-Remove_if Idiom to Remove Elements From a Vector Not Work As Expected?

理解用於向量刪除的erase-remove_if 慣用法

在C 語言中,erase-remove_if 慣用法被廣泛用於從基於給定標準的向量。讓我們深入研究這個習慣用法被錯誤實現的具體範例,並探索潛在的陷阱。

問題:

考慮一個名為 stopPoints 的向量,其中包含整數對和方向價值。目標是使用erase-remove_if 慣用法從向量中刪除包含特定整數(例如 4)的所有對。然而,執行程式碼後,結果出乎意料。

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

執行此操作後,向量中仍包含 .first 值設為 4 的對的實例。

解決方案:

錯誤在於擦除功能的錯誤使用。在erase-remove_if習慣用法中,std::erase函數需要兩個迭代器-一個是指向要刪除的第一個元素的迭代器,另一個是指向容器末端的迭代器。

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

在這個更正的實現中,從std::remove_if 返回的迭代器(指向要刪除的第一個元素)到向量末尾的範圍被刪除,有效刪除與謂詞匹配的所有元素(在本例中為.first == 4)。

解釋:

  • std::remove_if 掃描向量,將與謂詞相符的元素(.first == 4 的元素)移到結尾。
  • std::remove_if 傳回一個指向與謂詞不符的第一個元素(即要保留的第一個元素)的迭代器。
  • std::erase 將元素範圍從傳回的迭代器刪除到向量的結尾,有效地刪除所有 .first == 4 的元素。

結論:

erase-remove_if 習慣用法是一個強大的工具,可以有效地刪除從向量中刪除滿足特定條件的元素。了解函數 std::remove_if 和 std::erase 如何交互對於其正確實現至關重要。

以上是為什麼使用 Erase-Remove_if 習慣用法從向量中刪除元素不能如預期般運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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