簡體   English   中英

C++:兩個范圍的交集

[英]C++: Intersection Of two ranges

我試圖在 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不能用的錯誤。 我如何使用它找到路口?

我在 SO 上找到了一種方法,如下所示:

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

盲目的“復制粘貼”是不好的。 在您復制的代碼中(您應該承認),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}
}

試試這個。

#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})

可能這會有所幫助。

比如說范圍[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]范圍即可獲得交集值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM