设置插入进行奇怪的比较次数
Set insert doing a weird number of comparisons
我无法解释 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
中已有的项目数。常数因素是实施质量问题。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 为什么比较运算符如此快速
- 预处理器:插入结构名称中的前一个行号
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 在未初始化映射的情况下,将值插入到映射的映射中
- 如何在c++中只将键插入到bimap的一侧
- std::为插入和排序设置不同的比较器
- 使用自定义比较器C++映射,不插入所有元素
- 当我添加自定义比较器时,无法插入新元素以设置
- 使用带有比较结构的lower_bound将对象插入矢量
- 计数Heapsort和插入排序中的复制和比较数
- 可视化如何插入单词并使用它在C 中进行IF进行比较
- 插入比较#'s看起来太大了
- 自定义比较器,将唯一元素插入到c++中的集合中
- 比较具有替代排序的自定义类型的std::元组(或std::对).是否可以插入自定义的小于/比较函数
- 如何在std::set中为插入唯一元素提供比较功能
- 当>=用于元素比较时,插入排序比>慢,为什么?
- 设置插入进行奇怪的比较次数