【问题标题】:std::set method to get number of elements lower than a given element?std::set 方法获取低于给定元素的元素数?
【发布时间】:2020-08-10 14:12:48
【问题描述】:

std::set 是否支持任何返回小于给定元素的元素数量的方法?

我知道我们有 lower_bound 将迭代器返回到给定元素的下限;但它不会返回给定元素之前的元素数量。

我知道我可以从头迭代到下界迭代器;但在最坏的情况下,这将花费O(n) 时间。我们在O(logn) 中是否有这样的方法?

【问题讨论】:

    标签: c++ stl set


    【解决方案1】:

    如果您特别有std::set,那么您可以像这样使用自定义std::set::lower_bound

    auto lb = s.lower_bound(key);
    

    保证O(log n) 复杂度。

    要获取元素的数量,您可以像这样使用std::distance

    auto count = std::distance(s.begin(), s.lower_bound(key));
    

    但是,std::set 不支持随机访问迭代器,因此 std::distance 调用具有 O(n) 复杂性。


    如果你有一些排序范围,你仍然可以像这样使用lower_bounddistance

    auto lb = std::lower_bound(s.begin(), s.end(), key);
    auto count = std::distance(s.begin(), lb);
    

    但请注意,如果s 不支持随机访问,那么两个这两个操作都有O(n) 复杂度。

    【讨论】:

    • 我不确定你从哪里得到std::distance(s.begin(), s.lower_bound(key)); 具有O(log(n)) 的复杂性。当然对lower_bound 的调用确实如此,但对distance 的调用是O(n)(对于可能更小的n
    • @MarshallClow From here 如果 InputIt 还满足 LegacyRandomAccessIterator 的要求,复杂性是不变的。 我是不是误会了什么?
    • 你缺少的是一个集合没有随机访问迭代器。
    • @MarshallClow 是的,谢谢。编辑了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    相关资源
    最近更新 更多