STL喜欢具有O(1)性能的容器

gra*_*asm 5 c++ stl

我找不到答案,但我很确定我不是第一个寻找答案的人.没有人知道/使用/看到一个像STL容器双向有权访问迭代O(1)复杂的插入/删除/查找
谢谢.

ato*_*ice 10

插入,擦除和查找没有具有O(1)复杂度的抽象数据类型,它还提供了双向访问迭代器.

编辑:

对于任意大的域都是如此.给定一个足够小的域,您可以使用数组和双向链表实现插入,擦除和查找的O(1)复杂度集和双向访问迭代器:

std::list::iterator array[MAX_VALUE];
std::list list;
Run Code Online (Sandbox Code Playgroud)

初始化:

for (int i=0;i<MAX_VALUE;i++)
    array[i] = list.end();
Run Code Online (Sandbox Code Playgroud)

插入:

if (array[value] != list.end())
    array[value] = list.insert(value);
Run Code Online (Sandbox Code Playgroud)

删除:

if (array[value] != list.end()) {
    array[value].erase();
    array[value] = list.end();
}
Run Code Online (Sandbox Code Playgroud)

抬头:

array[value] != list.end()
Run Code Online (Sandbox Code Playgroud)


ima*_*ima 1

在实践中,使用数组(向量)并推迟插入和删除的成本可能就足够了。

通过将元素标记为已删除来删除元素,将元素插入到所需位置的 bin 中,并记住较大索引的偏移量。

插入和删除将是 O(1) 加上在方便的时候进行 O(N) 清理;查找平均时间为 O(1),最坏情况为 O(自上次清理以来的更改次数)。