使用设置检测重复项
Detecting duplicates with set
我正在处理不应该弹出两次的数据。如果是这样,它应该检测到它并调用处理它的函数。
目前,我正在将一些数据推送到向量,在插入之前,它应该检查数据是否已包含在该向量中。目前,这不是很有效,例如
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::set
或std::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_set
。insert
有一个方法,根据库版本,它会返回有关插入的信息(如果插入有效,则bool
为真,如果已经插入,则为假)或迭代器等。查找库的文档。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 使用CMake检测支持的C++标准
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 检测到 Conan 配置文件设置与 CMake 之间的编译器版本不匹配
- Visual Studio 项目设置,用于检测英特尔跟踪分析器
- c++Windows自动检测代理设置
- 我是否需要为每个要检测到的每个精灵设置AddEventListenerWithSceneGrapriority
- Win32 中是否有一条消息或通知来检测用户何时更改区域设置?
- 使用设置检测重复项
- 设置碰撞检测,然后在 2D 游戏中处理碰撞
- 设置 for 循环以循环,直到检测到空字节
- 设置检测插入故障
- 在C++中,如何以编程方式检测 Windows 上的反向滚动设置
- 未将此指针设置为const的构造函数会导致未检测到的问题
- 检测Windows(IE)代理设置更改