2016-03-21 79 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; 
}