從 C++ 中的vector中刪除重複項

Google Translate Icon

這篇文章將討論如何在 C++ 中從vector中刪除重複項。

1.使用 std::remove 功能

一個簡單的解決方案是迭代vector,對於每個元素,如果存在,我們從vector中刪除其所有重複項。我們可以為此編寫自己的例程或使用 std::remove 使我們的代碼優雅的算法。這種方法佔用恆定空間,但運行在 O(n2) 時間。

下載  運行代碼

輸出:

5 2 1 3 4

2.使用 std::unordered_set 功能

在這裡,想法是迭代vector並跟踪集合中的已訪問元素。如果之前沒有看到一個元素,我們將它再次插入到vector中從頭開始的下一個可用位置。

這種方法需要額外的存儲來存儲數據結構並運行在 O(n) 時間如果 std::unordered_set 用過 std::set.

下載  運行代碼

 
這是另一個使用集合的解決方案。這個想法是在一個集合中插入所有vector元素並將集合的內容再次復制迴vector中。這是因為將元素插入集合中會刪除所有重複項,因為所有集合元素必須是不同的。請注意,這可能會改變vector中元素的原始順序。

下載  運行代碼

輸出:

4 3 1 2 5

3.使用 std::remove_ifstd::unordered_set 功能

另一個有效的解決方案是使用 std::remove_ifstd::unordered_set.

最終邏輯與之前的解決方案相似,我們迭代vector並跟踪集合中的已訪問元素。如果之前沒有看到該元素,我們將它再次插入到vector中從頭開始的下一個可用位置。

請注意, std::remove_if 算法不知道底層容器。它實際上並沒有從容器中刪除元素,而是移動所有 安全的 元素到前面並返回一個指向結束位置的迭代器,因此可以使用一次調用將它們刪除 std::erase.這種技術通常被稱為 擦除刪除成語.

下載  運行代碼

4.使用 std::copy_ifstd::unordered_set 功能

以下是我們如何通過使用 std::copy_if 算法。這將適用於 C++11 及更高版本。

下載  運行代碼

輸出:

5 2 1 3 4

5.使用 std::remove_copy_ifstd::unordered_set 功能

std::remove_copy_if 算法也將起作用,如下所示:

下載  運行代碼

6.使用 std::sortstd::unique 功能

最後,我們還可以對vector進行排序並調用 std::unique,刪除重複的連續元素。這有效,但不保留元素的原始順序。這種方法佔用恆定空間,但運行在 O(n.log(n)) 時間。

下載  運行代碼

輸出:

1 2 3 4 5

這就是從 C++ 中的vector中刪除重複項的全部內容。

評價這篇文章

平均評分 4.41/5。票數: 34

暫時沒有票!成為第一個給這篇文章評分的人。

很抱歉這篇文章對您沒有用處!

告訴我們如何改進這篇文章?




謝謝閱讀。

請使用我們的 在線編譯器 使用 C、C++、Java、Python、JavaScript、C#、PHP 和許多更流行的編程語言在評論中發布代碼。

像我們?將我們推薦給您的朋友,幫助我們成長。快樂編碼 :)



訂閱
通知
guest
2 註釋
投票最多
最新 最老的
內聯反饋
查看所有評論
請勿點擊此鏈接,否則您將被禁止訪問該網站!