使用STD和c++从set with constant time中删除一个值
Delete a value from set with constant time using STD and C++
我需要一组整数,并能够在常数时间内删除值。我该怎么做呢?
现在我使用std::list,但它不是常量时间:
int myints[]= {17,89,7,14};
std::list<int> mylist (myints,myints+4);
mylist.remove(89);
如果您确实需要保证恒定时间删除,那么如果在编译时知道大小,则可能需要使用std:bitset
。
如果在编译时不知道大小,可以考虑Boost dynamic_bitset
或std::vector<bool>
。后者经常受到批评,因为它不是容器,这可能非常令人惊讶,因为在其他类型上实例化的vector
是容器。尽管如此,它似乎可以很好地完成手头的工作。
在任何情况下,对于允许范围内的每个值,你都有一个位/布尔值。您可以通过将该索引处的位/布尔值设置为1/true来"插入"值,并通过将该索引处的位/布尔值设置为0/false来"删除"值。
对于前面的所有内容,枚举集合中当前的元素(甚至找到它包含多少)在集合可能存储的数字范围内是线性的(而您当前的实现可以以恒定的复杂度找到集合中当前存储的项目的数量,并找到集合中具有线性复杂度的成员它实际包含的项目的数量。
如果你希望这组数字是相对稀疏的,并且可以接受删除时间通常是近似常数,即使不能保证,那么你可能想要使用std::unordered_set
。
还有std::set
,它保证了删除操作的对数复杂度。这通常是O(log N),这比std::unordered_set
(通常是O(1))慢,但它的最坏情况也是O(log N),这比unordered_set
的最坏情况要好,在最坏情况下是O(N)。
这些都可能比您目前使用的std::list
(显然)有实质性的速度提高。确切的差异会有所不同,但是一个完整的数量级的速度提升(对于这个特定的操作)根本不会令人惊讶(好吧,我不会感到惊讶,无论如何)。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 从链接列表c++中删除一个项目
- G++ 发出警告,要求删除一个代码的数组,但不删除另一个代码的数组
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- 仅从无序集合中删除一个项目
- C++ 从数组中删除一个最大值和零
- 如果一个类继承了一个带有虚拟 dtor 的类,为什么要删除一个没有虚拟 dtor 的类是可以的
- 如何在不使用循环或迭代器的情况下检查所有列表元素并在满足条件时删除一个
- 我只想从文本文件中删除一个特定值或行
- C 对象阵列删除一个
- 在包含相同项目的向量中删除一个项目
- 当Ccarray_foreach中删除一个对象时,就会发生问题
- 从C++二进制搜索树中删除一个节点(类而非结构)
- C 从整数删除一个数字
- 如何从C 中的对象向量中删除一个项目
- 在单个链接列表中间删除一个节点,仅给定对该节点的访问
- 很难从我的二进制搜索树中删除一个节点
- 添加两个节点并在比较时删除一个节点
- C++-从单链循环列表中的任何索引中删除一个节点
- 如何从结构数组中删除一个数据行?(带索引)