使用STD和c++从set with constant time中删除一个值

Delete a value from set with constant time using STD and C++

本文关键字:删除 一个 time c++ STD set constant with 使用      更新时间:2023-10-16

我需要一组整数,并能够在常数时间内删除值。我该怎么做呢?

现在我使用std::list,但它不是常量时间:

int myints[]= {17,89,7,14};
std::list<int> mylist (myints,myints+4);
mylist.remove(89);

如果您确实需要保证恒定时间删除,那么如果在编译时知道大小,则可能需要使用std:bitset

如果在编译时不知道大小,可以考虑Boost dynamic_bitsetstd::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(显然)有实质性的速度提高。确切的差异会有所不同,但是一个完整的数量级的速度提升(对于这个特定的操作)根本不会令人惊讶(好吧,我不会感到惊讶,无论如何)。