如何在std::set中计算给定元素之前的元素个数

How to count no of elements before a given element in std::set

本文关键字:元素 计算 std set      更新时间:2023-10-16

我想在给定元素的下界之前找到set中不存在的元素,我想到使用std::set::迭代器的指针算术,因为它们的行为像指针,这是我尝试的:

set<int>q;
set<int>::iterator curr;
set<int>::iterator strt;
l = num.size();
q.insert(num[l-1]);
strt = q.begin();
temp = 1;
int x;
for(int i=l-2;i>=0;i--)
{
    curr = q.lower_bound(num[i]);
    if(curr == q.end())
        stats.push_back({temp,0});
    else
    {
        x = curr-strt;//ERROR
        stats.push_back({x,temp-x});
    }
    q.insert(num[i]);
    temp++;
}

在给定元素的下界之前,是否有办法找到集合中不存在的元素?

必须从头到尾遍历该集合,以计算元素的数量。这里有一个标准库函数:

x = std::distance(strt, curr);

curr-strt这样的算法只在随机访问迭代器中定义,计算可以在常数时间内完成。像distance这样的函数可以用于更一般的迭代器类型,但如果迭代器不直接支持该操作符,则可能很慢。

使用数据结构增强,可以在对数时间内执行动态顺序统计。

我曾经为此写过一次libstdc++扩展,后来又写了一个python版本。