用set检测重复项

时间:2016-03-21 15:48:39

标签: c++ set

我正在使用不应该弹出两次的数据。如果是,它应该检测它并调用处理该函数的函数。

目前,我正在将一些数据推送到矢量,在插入之前,它应检查数据是否已包含在该矢量中。目前,这不是很有效,例如

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

我知道set是一种特殊的向量,它只允许唯一的数据。

是否有其他方法可以检测添加(或至少尝试添加)重复数据到set

4 个答案:

答案 0 :(得分:18)

首先,让我们清楚set不是vector的特殊类型。它是一种与矢量正交的容器,可以防止重复。

您可以通过检查insert

的返回值来检测重复项
if(my_set.insert("value").second == false) { do_something_for_duplicate(); }

答案 1 :(得分: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;

答案 2 :(得分:4)

std::setstd::unordered_set是来自标准c ++库的另一个容器,但不是vector ...他们遵守不同的规则:

  • 向量或多或少是一个可增长的数组:对重复项没有控制权,但尊重插入顺序
  • 集合需要对其包含的数据进行排序,并允许根据该顺序浏览其数据。它会在插入时自动拒绝重复
  • unordered_set也会在插入时拒绝重复,但浏览顺序是随机的(不完全是,它甚至完全确定,但取决于所使用的哈希函数)

对于矢量,查看它是否已包含值的简单方法是(ref):

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

对于一组unordered_set,insert方法返回一个指向元素的对迭代器 - boolean指示它已添加或不存在的位置

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

答案 3 :(得分:1)

您可以使用std::unordered_set。有一个方法insert,根据库版本返回有关插入的信息(一对bool如果插入有效则为true,如果已经存在则为false)或迭代器,等。找到你的文档。