使用 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::set
或 std::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;
}
我正在处理不应弹出两次的数据。如果是,它应该检测到它并调用一个函数来处理它。
目前,我正在将一些数据推送到一个向量,在插入之前,它应该检查该数据是否已包含在该向量中。目前,这不是很有效,例如
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
:
if(my_set.insert("value").second == false) { do_something_for_duplicate(); }
您可以使用 std::unordered_set
。有一种方法 insert
取决于库版本 returns 您有关插入的信息(如果插入有效则为真,如果插入有效则为假,如果一对 bool
),或迭代器等。查找您的库的文档。
A std::set
或 std::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;
}