Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理集合区间的算法 < >在C++中实现一个需要跟踪设置间隔的类的最佳方法是什么?我希望利用现有的STL或Boost库,但除了使用标准容器之外,我不得不求助于手工实现算法,这是一个非常棘手的问题,而且由于工作期限的关系,我不得不以牺牲一些性能为代价来简化算法。一定有更好的办法_C++_Algorithm_C++11_C++14 - Fatal编程技术网

处理集合区间的算法 < >在C++中实现一个需要跟踪设置间隔的类的最佳方法是什么?我希望利用现有的STL或Boost库,但除了使用标准容器之外,我不得不求助于手工实现算法,这是一个非常棘手的问题,而且由于工作期限的关系,我不得不以牺牲一些性能为代价来简化算法。一定有更好的办法

处理集合区间的算法 < >在C++中实现一个需要跟踪设置间隔的类的最佳方法是什么?我希望利用现有的STL或Boost库,但除了使用标准容器之外,我不得不求助于手工实现算法,这是一个非常棘手的问题,而且由于工作期限的关系,我不得不以牺牲一些性能为代价来简化算法。一定有更好的办法,c++,algorithm,c++11,c++14,C++,Algorithm,C++11,C++14,例如,我需要以下类型的行为: class SubRange { public: SubRange(const T& lower_bound, const T& upper_bound); ... }; Subrange r1(1,3); Subrange r2(5,6); Subrange r3(6,9); Subrange tot = r1+r2+r3; cout << tot; //displays (1,3) (5,9) Subrange gaps =

例如,我需要以下类型的行为:

class SubRange
{
public:
SubRange(const T& lower_bound, const T& upper_bound);
...
};

Subrange r1(1,3);
Subrange r2(5,6);
Subrange r3(6,9);

Subrange tot = r1+r2+r3;
cout << tot;  //displays (1,3) (5,9)

Subrange gaps = SubRange(1,9) - tot;
cout << gaps; // displays (4,4)
类子范围
{
公众:
子范围(常数T和下界,常数T和上界);
...
};
子域r1(1,3);
子域r2(5,6);
子范围r3(6,9);
子范围tot=r1+r2+r3;

试试这个,它对我很有效 注意:可以使用“最小”和“最大”来获取“最大”子间隔

    #include <iostream>
    #include <vector>

    using namespace std;

    struct val{
        int start = 0;
        int end = 0;
    };
    void FindSubSortbyStart(val *x,unsigned long n){
        for(int i = 1;i < n;i++)
            for(int j = i;j > 0;j--)
                if(x[j].start < x[j - 1].start )
                    swap(x[j],x[j-1]);
                else
                    break;
    }
    void FindSub(val *x,unsigned long n){
        vector<val> subval;

        int min = x[0].start;
        int max = x[0].end;

        for(int i = 1;i <n;i++){
            if(max  + 1>= x[i].start){
                if(x[i].end >= max)
                    max = x[i].end;
            }else{

                val temp;

                temp.start = max + 1;
                temp.end = x[i].start - 1;

                max = x[i].end;
                min = x[i].start;

                subval.push_back(temp);

                cout << subval[subval.size() - 1].start << "\t"<< subval[subval.size() - 1].end << endl;
            }
        }
    }

    int main(int argc, const char * argv[]) {

        unsigned long n = 3;

        val *x = new val[n];

        x[0].start = 1;
        x[0].end = 3;

        x[1].start = 5;
        x[1].end = 5;

        x[2].start = 7;
        x[2].end = 9;

        FindSubSortbyStart(x,n);
        FindSub(x,n);

        return 0;
    }
#包括
#包括
使用名称空间std;
结构值{
int start=0;
int end=0;
};
void FindSubSortbyStart(val*x,无符号长n){
对于(int i=1;i0;j--)
如果(x[j].start=max)
max=x[i]。结束;
}否则{
瓦尔温度;
启动温度=最大值+1;
temp.end=x[i]。开始-1;
max=x[i]。结束;
min=x[i]。开始;
子值推回(温度);
cout您可以使用来完成此任务:

#include <iostream>
#include <boost/icl/interval_set.hpp>

int main()
{
    using IntervalSet = boost::icl::interval_set<int>;
    using Interval = boost::icl::interval<int>;

    IntervalSet set;

    set.insert(Interval::closed(1,3));
    set.insert(Interval::closed(5,6));
    set.insert(Interval::closed(6,9));

    std::cout << set << std::endl;

    IntervalSet total;
    total.insert(Interval::closed(1,9));

    std::cout << total << std::endl;

    IntervalSet diff_set = total - set;
    std::cout << diff_set << std::endl;

    for (auto it : diff_set)
    {
        // convert (possibly) open interval into closed
        std::cout << "[" << boost::icl::first(it) << "," << boost::icl::last(it) << "]"<< std::endl;
    }
}

您可以从STL中使用任何需要的排序算法
{[1,3][5,9]}
{[1,9]}
{(3,5)}
[4,4]