C ++ - 查找两个范围的交集

时间:2013-11-16 20:27:45

标签: c++ range intersection set-intersection

在C ++中找到两个范围的交集的最佳方法是什么?例如,如果我有一个范围为[1 ... 20],包括[13 ... 45],则我想得到[13 ... 20],因为这是它们之间的交集。

我考虑过在C ++中使用原生集合交集函数,但我首先必须将范围转换为集合,这对于大值会花费太多的计算时间。

4 个答案:

答案 0 :(得分:28)

intersection = { std::max(arg1.min, arg2.min), std::min(arg1.max, arg2.max) };
if (intersection.max < intersection.min) {
  intersection.markAsEmpty();
}

答案 1 :(得分:5)

为了完整起见,我想添加一个“提升答案”。

如果您已经使用了boost,则无需编写自己的代码,但只能使用标题

#include <boost/numeric/interval.hpp>

并使用intersect函数处理类型interval<T>

答案 2 :(得分:0)

简单的答案是只找到交集范围的最终值,然后在该范围内进行迭代。

对于范围[l1, r1][l2, r2]之间的交集可以计算为:

 if ((r1 < l2) ||  (r2 < l1)) then no intersection exits.
 else l = max(l1, l2) and r = min(r1, r2)

只需在[l, r]范围内进行迭代即可获得交点值。

答案 3 :(得分:-2)

在2018年,强烈建议使用gameScene2 = GameScene(size: view, bounds: size) https://en.cppreference.com/w/cpp/algorithm/set_intersection。它不必来自std::set_intersection,但必须对范围进行排序。

示例:

std::set

输出:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
int main()
{
    std::vector<int> v1{1,2,3,4,5,6,7,8};
    std::vector<int> v2{        5,  7,  9,10};
    std::sort(v1.begin(), v1.end());
    std::sort(v2.begin(), v2.end());

    std::vector<int> v_intersection;

    std::set_intersection(v1.begin(), v1.end(),
                          v2.begin(), v2.end(),
                          std::back_inserter(v_intersection));
    for(int n : v_intersection)
        std::cout << n << ' ';
}