使用设置检测重复项

Detecting duplicates with set

本文关键字:检测 设置      更新时间:2023-10-16

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

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

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

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

有没有另一种方法可以检测正在添加(或至少尝试将其添加)到set的重复数据?

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

您可以通过检查 insert 的返回值来检测重复项:

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

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

例:

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

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

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

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

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

对于一组unordered_set,insert 方法返回一个指向元素的对迭代器 - 布尔值指示它已添加或未添加到何处

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

您可以使用std::unordered_setinsert有一个方法,根据库版本,它会返回有关插入的信息(如果插入有效,则bool为真,如果已经插入,则为假)或迭代器等。查找库的文档。