在重複刪除中保持順序: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_ifstd::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_ifstd::vector<int> uniqueNumbers; NotDuplicate<int> pred; std::remove_copy_if(numbers.begin(), numbers.end(), std::back_inserter(uniqueNumbers), std::ref(pred));刪除重複項:此解決方案提供了高效的利用STL 演算法的多功能性,在保持原始順序的同時刪除重複項的優雅方式。
以上是如何從未排序的向量中刪除重複項,同時保留 C 中的順序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!