什么容器允许binary_search和随机删除元素?

时间:2014-10-14 13:54:15

标签: c++ list map stl containers

我一直在使用std::vector但它变得笨拙,因为它迭代的数据已经增长,我希望能够在它们变得多余时过滤掉随机元素。我在std::list的其他地方有这种行为,但无法让binary_search与之相提并论。

我是否可以使用一些代码让binary_search再次使用,或者我是否必须使用更复杂的容器和语法?

        if(binary_search(iter + 1, myLines.end(), line)) {
            firstFound.assign(line);
            if (numFinds++) break;
        }

2 个答案:

答案 0 :(得分:6)

std::set的查找为O(log(N)),与binary_search完全相同,如果您有迭代器,则删除为O(1),{{1}如果你没有(查找+删除)。虽然集合将存储已排序的元素,但这对您来说一定没问题,因为O(log(N))也仅适用于已排序的范围。

答案 1 :(得分:0)

听起来你正在寻找的是binary search tree (BST)

它通常允许二进制搜索(毕竟它在名称中),删除相对简单。

存在多种二叉搜索树。一些常见的:

  • simple BST:在最差和最佳案例搜索性能之间有很大差异,具体取决于BST的具体用法(插入和删除)。树越高,性能越差。
  • self-balancing BST:在每次插入/删除时,如果需要,节点会被移动以保持树高最小,因此搜索性能最佳。这是以插入和删除时增加的开销(可能会变得非常高)为代价的。
  • red-black tree:一种自平衡的BST,并不总是追求最佳高度,但仍足以保持查找O(log n)。它在各种用例中表现非常一致(即具有良好的通用性能),这就是为了实现std::set而选择它的原因(见Armen Tsirunyan's answer)。
  • splay tree:BST将最近访问的项目保存在树的顶部,以便最快地访问它们。它不是自平衡的,所以高度不会保持最小。当最近访问的数据可能很快再次被访问时,这种树非常有用。
  • treap:使用随机优先级的BST被分配给项目,以便(即使用概率论)保持树的高度接近最小值。它不能保证最佳的搜索性能,但在实践中通常会这样做,而且没有额外的自平衡或类似的重新组织算法的开销。

哪一种最适合您,取决于您的具体用例。