2016-03-21 103 views
3

我正在處理不應彈出兩次的數據。如果有,它應該檢測它並調用處理該函數的函數。檢測重複集

目前,我正在推送一些數據到一個向量,並在插入之前,它應該檢查數據是否已經包含在該向量中。目前,這不是很有效,e.g

for (int i = 0; i < myVector.size() ; i++) 
{ 
    if (myVector[i] == data) 
    { 
      // invoke function 
      return false; 
    } 
} 

我知道set是一種特殊的載體,只允許唯一的數據。

是否有另一種方法來檢測重複數據被添加(或至少試圖將其添加到)set

+0

是否有任何理由使用矢量? –

+0

我從函數返回的向量,它比從它返回一個數組更優化(這就是我在這裏告訴的)。在代碼的其他部分,我使用結構向量,但想法是一樣的 – Darlyn

+3

你的問題並不清楚,你要求使用向量或集合重複? –

回答

12

首先,讓我們說清楚,一個set不是一種特殊的vector。這是一種與矢量正交的容器,可以防止重複。

您可以通過從insert檢查返回值檢測重複:

if(my_set.insert("value").second == false) { do_something_for_duplicate(); } 
6

std::set返回std::pair<iterator, bool>,其中boolfalse插入失敗時(通過添加例如重複值)。

例子:

std::set<int> set{ 1, 2, 3 }; 
auto result = set.insert(1); 
if (!result.second) 
    std::cout << "Failed to insert element!" << std::endl; 
1

您可以使用std::unordered_set。有一種方法insert,根據庫版本返回有關插入的信息(如果插入有效,則返回,如果插入有效,則返回false)或迭代器等。查找lib文檔。

3

std::setstd::unordered_set是另一個容器從標準C++庫但不是vector ...他們服從不同的規則:

  • 載體是或多或少可增長的數組:上重複沒有控制,但是尊重廣告訂單
  • 一個集合需要對其包含的數據進行訂單,並允許根據該訂單瀏覽其數據。它在插入時間
  • 一個unordered_set也在插入時間拒絕重複自動拒絕重複,但瀏覽順序是種隨機的(不完全,這是甚至完全確定性但取決於所使用的散列函數)

對於一個矢量,查看簡單的方式,如果它已經包含一個值是(ref):

std::find(vector.begin(), vector.end(), item) != vector.end() 

對於一組unordered_set的,插入方法返回一對迭代器指向的元素 - 指示它其中布爾被添加或不是因爲已經在那裏

if (! my_set.insert(data).second) { 
    // invoke function 
    return false; 
}