使用 set 检测重复项

Detecting duplicates with set

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

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

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

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

是否有另一种方法来检测添加(或至少尝试添加)到 set 的重复数据?

std::set returns std::pair<iterator, bool>,其中 bool 在插入失败时为 false(例如通过添加重复值)。

示例:

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

首先让我们明确一点 set 不是一种特殊的 vector。它是一种容器,与矢量正交,恰好可以防止重复。

您可以通过检查 insert:

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

您可以使用 std::unordered_set。有一种方法 insert 取决于库版本 returns 您有关插入的信息(如果插入有效则为真,如果插入有效则为假,如果一对 bool ),或迭代器等。查找您的库的文档。

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

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

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

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

对于一组 unordered_set,插入方法 returns 指向元素的一对迭代器 - 布尔值,指示添加或不添加的位置

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