C++ 使用STD和C+从具有恒定时间的集合中删除一个值+;
我需要一组整数,并且能够在恒定时间内删除一个值。我如何做到这一点 现在我使用的是std::list,但它不是常数时间:C++ 使用STD和C+从具有恒定时间的集合中删除一个值+;,c++,C++,我需要一组整数,并且能够在恒定时间内删除一个值。我如何做到这一点 现在我使用的是std::list,但它不是常数时间: int myints[]= {17,89,7,14}; std::list<int> mylist (myints,myints+4); mylist.remove(89); int myints[]={17,89,7,14}; std::list mylist(myints,myints+4); mylist.remove(89); 如果确实需要保证恒定时间删除
int myints[]= {17,89,7,14};
std::list<int> mylist (myints,myints+4);
mylist.remove(89);
int myints[]={17,89,7,14};
std::list mylist(myints,myints+4);
mylist.remove(89);
如果确实需要保证恒定时间删除,那么如果编译时已知大小,则可能需要使用std:bitset
如果编译时不知道大小,则可以考虑Boost <代码> DyjixBITSET 或<代码> STD::vector < /代码>。后者经常受到批评,因为它不是一个容器,这可能非常令人惊讶,因为在其他类型上实例化的
vector
是一个容器。尽管如此,它似乎可以很好地完成手头的工作
在任何情况下,在允许的范围内,每个值都有一个位/布尔值。您可以通过将该索引处的位/布尔值设置为1/true来“插入”一个值,并通过将该索引处的位/布尔值设置为0/false来“删除”一个值
对于上述所有操作,枚举集合中当前的元素(甚至查找它包含的元素数量)与集合可能存储的数字范围是线性的(而您当前的实现可以找到当前存储在集合中具有恒定复杂性的项的数量,并找到集合中具有与实际包含的项的数量成线性关系的复杂性的成员
如果您希望数字集相对稀疏,并且可以接受删除时间通常是近似恒定的,即使不能保证,那么您可能希望使用std::unordered_set
还有std::set
,它保证了删除的对数复杂性。这通常是O(logn),比std::unordered_set
(通常是O(1))慢,但它的最坏情况也是O(logn),这比unordered_set
的最坏情况要好,在最坏情况下是O(N)
与您(显然)当前使用的
std::list
相比,上述任何一项都可能带来显著的速度提升。确切的差别会有所不同,但一个完整数量级的速度提升(对于这一特定操作)一点也不奇怪(好吧,无论如何,我不会感到惊讶).Usestd::unordered\u set
Related:您可能想提及这些方法中每种方法的“枚举元素”的复杂性;或者至少是那些比其当前实现更糟糕的方法。和(取决于容器的大小和包含的元素的大小)另一个可行的选择可能是std::vector
(您需要保持排序)与std::binary_search
。。。