【问题标题】:how to check whether a set has element(s) in certain range in C++如何检查一个集合是否在C ++中的某个范围内具有元素
【发布时间】:2012-01-25 02:39:38
【问题描述】:

我需要检查 std::set 是否包含某个范围内的元素。例如,如果集合是一个set<int>{1, 2, 4, 7, 8},并且给定一个int 间隔[3, 5](包括两个端点),我需要知道它是否有集合中的元素。在这种情况下,返回 true。但如果区间为[5, 6],则返回false。间隔可能是[4, 4],但不是[5, 3]

看起来我可以使用set::lower_bound,但我不确定这是否是正确的方法。我还希望尽可能降低复杂性。我相信使用lower_bound 是对数,对吗?

【问题讨论】:

    标签: c++ search stl set stdset


    【解决方案1】:

    您可以同时使用lower_boundupper_bound。您测试 3 到 5 之间的元素(含)的示例可以编写如下:

    bool contains_elements_in_range = s.lower_bound(3) != s.upper_bound(5);
    

    您可以通过切换您正在使用的函数(upper_boundlower_bound)来使范围包含或排除两端:

    s.upper_bound(2) != s.upper_bound(5); // Tests (2, 5]
    s.lower_bound(3) != s.lower_bound(6); // Tests [3, 6)
    s.upper_bound(2) != s.lower_bound(6); // Tests (2, 6)
    

    对数时间是你能达到的最好的,因为集合是排序的,你需要在排序范围内找到一个元素,这需要二分搜索。

    【讨论】:

    • 如果 set 在该范围内有多个元素怎么办?
    【解决方案2】:

    如果您确定要使用std::set,那么我同意它的lower_bound 方法是可行的方法。正如你所说,它将具有对数时间复杂度。

    但是根据您的尝试,如果您使用排序的std::vector 和独立的std::lower_bound 算法(std::lower_bound(v.begin(), v.end(), 3)),您的程序的整体性能可能会更好。这也是对数的,但常数较低。 (当然,缺点是向std::vector 中插入元素并保持排序通常比向std::set 中插入元素要昂贵得多。)

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 2012-05-13
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      相关资源
      最近更新 更多