设置插入进行奇怪的比较

时间:2014-04-09 08:40:45

标签: c++ stl set comparator

我无法解释插入新元素时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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

我不知道具体因为它们将取决于您的std::set实施,但是确定两个项目的相等性需要进行两次比较,因为它基于not (x < y) and not (y < x)暗示的事实x == y

根据树的优化方式,您可能会支付第一个比较以确定它是向左还是向右,然后进行两次比较以检查它是否相等。

除了比较次数为O(log N)之外,标准没有要求,其中N是set中已有的项目数。不变因素是实施质量问题。