我正在使用不应该弹出两次的数据。如果是,它应该检测它并调用处理该函数的函数。
目前,我正在将一些数据推送到矢量,在插入之前,它应检查数据是否已包含在该矢量中。目前,这不是很有效,例如
for (int i = 0; i < myVector.size() ; i++)
{
if ( myVector[i] == data )
{
// invoke function
return false;
}
}
我知道set
是一种特殊的向量,它只允许唯一的数据。
是否有其他方法可以检测添加(或至少尝试添加)重复数据到set
?
答案 0 :(得分:18)
首先,让我们清楚set
不是vector
的特殊类型。它是一种与矢量正交的容器,可以防止重复。
您可以通过检查insert
:
if(my_set.insert("value").second == false) { do_something_for_duplicate(); }
答案 1 :(得分:6)
std::set
返回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;
答案 2 :(得分:4)
std::set
或std::unordered_set
是来自标准c ++库的另一个容器,但不是vector
...他们遵守不同的规则:
对于矢量,查看它是否已包含值的简单方法是(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)或迭代器,等。找到你的文档。