我无法解释插入新元素时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
答案 0 :(得分:4)
这是使用红黑树实现std::set
的副作用,与标准二叉树相比,这需要进行更多的比较。
答案 1 :(得分:4)
我不知道具体因为它们将取决于您的std::set
实施,但是确定两个项目的相等性需要进行两次比较,因为它基于not (x < y) and not (y < x)
暗示的事实x == y
。
根据树的优化方式,您可能会支付第一个比较以确定它是向左还是向右,然后进行两次比较以检查它是否相等。
除了比较次数为O(log N)之外,标准没有要求,其中N是set
中已有的项目数。不变因素是实施质量问题。