设置插入进行奇怪的比较次数

Set insert doing a weird number of comparisons

本文关键字:比较 插入 设置      更新时间:2023-10-16

我无法解释 std::set 在插入新元素时所做的比较次数。下面是一个示例:

对于此代码

struct A {
    int i = 0;
    bool operator()(int a, int b)
    {
        ++i;
        return a < b;
    }
};
int main()
{    
    A a;
    set<int, A> s1(a);
    s1.insert(1);    
    cout << s1.key_comp().i << endl;
    s1.insert(2);    
    cout << s1.key_comp().i << endl;
}

输出为

0
3

为什么插入第二个元素需要 3 次比较? o_O

这是使用红黑树实现std::set的副作用,与标准二叉树相比,这最初需要更多的比较。

我不知道

具体是什么,因为它们将取决于您std::set实现,但是确定两个项目的相等性需要两个比较,因为它是基于not (x < y) and not (y < x)意味着x == y的事实。

因此,根据树的优化方式,您可能需要先进行比较以确定它应该向左还是向右移动,然后进行两次比较以检查它是否相等。

该标准没有要求,只是比较次数为O(log N(,其中N是set中已有的项目数。常数因素是实施质量问题。