首頁 >後端開發 >C++ >如何從未排序的向量中刪除重複項,同時保留 C 中的順序?

如何從未排序的向量中刪除重複項,同時保留 C 中的順序?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-14 09:44:02451瀏覽

How to Remove Duplicates from an Unsorted Vector while Preserving Order in C  ?

在重複刪除中保持順序:STL 演算法來救援

處理未排序的向量時,刪除重複項同時保留向量的任務原始訂購可能會令人望而生畏。雖然像使用集合來追蹤唯一元素這樣的強力方法是可行的,但讓我們探索利用 STL 演算法的更優雅的解決方案。

STL 中一個強大的演算法是 std::copy_if。它需要一個謂詞來過濾元素,將那些符合條件的元素複製到新容器中。為了在這裡應用它,我們定義了一個 NotDuplicate 謂詞,它維護一組已處理的元素,並且如果之前遇到過某個元素,則計算結果為 false。

這是 的簡化實作NotDuplicate 謂詞:

struct NotDuplicate {
  bool operator()(const int& element) {
    return s_.insert(element).second;
  }
 private:
  std::set<int> s_;
};

有了這個謂詞,我們可以使用std::copy_if有了這個謂詞,我們可以使用

std::copy_if
std::vector<int> uniqueNumbers;
NotDuplicate<int> pred;
std::copy_if(numbers.begin(), numbers.end(), 
             std::back_inserter(uniqueNumbers),
             std::ref(pred));
來實作我們的目標:

此程式碼迭代原始向量,使用NotDuplicate 謂詞過濾元素。先前沒有遇到的元素將被複製到

uniqueNumbers

向量,保留原始順序。 對於那些沒有 C 11 支援的,另一種方法是 std::remove_copy_if,其作用相反std::copy_if。您可以反轉謂詞的邏輯(例如,如果遇到元素則傳回true)並使用

std::remove_copy_if
std::vector<int> uniqueNumbers;
NotDuplicate<int> pred;
std::remove_copy_if(numbers.begin(), numbers.end(), 
             std::back_inserter(uniqueNumbers),
             std::ref(pred));
刪除重複項:

此解決方案提供了高效的利用STL 演算法的多功能性,在保持原始順序的同時刪除重複項的優雅方式。

以上是如何從未排序的向量中刪除重複項,同時保留 C 中的順序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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