在C ++中找到两个范围的交集的最佳方法是什么?例如,如果我有一个范围为[1 ... 20],包括[13 ... 45],则我想得到[13 ... 20],因为这是它们之间的交集。
我考虑过在C ++中使用原生集合交集函数,但我首先必须将范围转换为集合,这对于大值会花费太多的计算时间。
答案 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 << ' ';
}