C ++:两个范围的交点

时间:2017-02-08 20:22:56

标签: c++ set set-intersection

我试图在C ++中找到两个范围的交集?例如,如果我有一个范围[1..14]包含,另一个范围包含[10..20],我希望得到[10..14],因为这是它们之间的交集。

我在SO上找到了一条方法如下:

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

我的变量很少如下:

unsigned long long int min1,min2,max1,max2 

我正试图找到这个交叉点。然后我做了以下事情:

intersection = { std::max(min1, min2), std::min(max1, max2) };
    if (intersection.max < intersection.min) {
      intersection.markAsEmpty();
    }

但是这给出了无法使用unsigned long long int的错误。如何使用它找到交叉点?

3 个答案:

答案 0 :(得分:3)

  

我在SO上找到了一条方法如下:

intersection = { std::max(arg1.min, arg2.min), std::min(arg1.max, arg2.max) };
if (intersection.max < intersection.min) {
  intersection.markAsEmpty();
}
盲目的“复制和粘贴”并不好。在代码copied(您应该承认)中,intersection是类类型的对象,显然有成员maxmin

对于您自己的用例:

unsigned long long int min1,min2,max1,max2 
......
auto Min = std::max(min1, min2);
auto Max = std::min(max1, max2);
if (Min < Max) {
    // There's an intersection. represented by {Min Max}
}

答案 1 :(得分:0)

试试这个。

#include <algorithm>
#include <utility>

struct range {
    unsigned long long min, max;
};

range intersect(const range& first, const range& second) {
    return {std::max(first.min, second.min), std::min(first.max, second.max)};
}

您可以将其称为例如intersect({min1, max1}, {min2, max2})

答案 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]范围内进行迭代即可获得交点值。