」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > C++ 中 `std::remove` 和 `std::erase` 有什麼不同?

C++ 中 `std::remove` 和 `std::erase` 有什麼不同?

發佈於2024-11-11
瀏覽:784

 What\'s the Difference Between `std::remove` and `std::erase` in C  ?

理解std::erase 和std::remove 之間的差異

std::remove 演算法是多功能工具,旨式演算法在操作在任何前向迭代器對上,使其適用於廣泛的容器和場景。與它的對應項 std::erase 不同,它有效地從容器中刪除和移除元素,std::remove 只重新排列元素。

1。揭示std::remove

std::remove 的細微差別的工作原理是將容器邏輯上劃分為兩個部分:一個包含要刪除的元素的部分和一個包含剩餘元素的部分。它透過迭代容器並將未刪除的元素向前移動,有效地覆蓋已刪除的元素來實現這一點。但是,需要注意的是,std::remove 實際上並沒有刪除已刪除的元素;而是刪除了已刪除的元素。它們保留在記憶體中,但實際上從視圖中隱藏。

當 std::remove 與容器 size() 函數結合使用時,此行為變得明顯。使用 std::remove 刪除元素後,std::size() 將繼續傳回容器的原始大小,即使某些元素在邏輯上被刪除。容器的大小僅在使用 std::erase 物理刪除隱藏元素後才會改變。

2。視覺化 std::remove

的影響考慮原始問題中提供的程式碼片段:

std::vector a;
a.push_back(1);
a.push_back(2);

std::remove(a.begin(), a.end(), 1);

int s = a.size();

執行std::remove 後,向量仍然包含兩個元素(2 和2),但第一個元素(1) 被邏輯刪除並從視圖中隱藏。因此,儘管存在隱藏的已刪除元素,std::size() 傳回 2。

3。使用 std::erase 進行物理刪除

要物理刪除已刪除的元素並更新容器的大小,std::erase 就發揮了作用。透過使用std::remove 傳回的迭代器對作為第一個參數呼叫std::erase,您可以消除隱藏的已刪除元素並減少容器的大小:

a.erase(std::remove(a.begin(), a.end(), 1), a.end());

在這種情況下,std::erase 物理刪除元素1,留下向量一個元素(2) 並更新大小1.

4。了解std::remove 實用程式的範圍

雖然std::remove 並非專門設計用於與std::erase 結合使用,但它在邏輯分區的各種場景中都有廣泛的用途。元素是必需的。例如,您可以使用 std::remove 來:

  • 將滿足特定條件的元素與不符合特定條件的元素分開。
  • 將相似的元素分組在一起。
  • 找出特定元素或元素集的位置。
最新教學 更多>

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

Copyright© 2022 湘ICP备2022001581号-3