如何在C ++中的pair <int,int>数组中使用upper_bound?

时间:2018-06-02 04:53:41

标签: arrays c++11 std-pair upperbound

我想在对数组上使用upper_bound,并且使用比较对象的第二个参数的比较器函数。请帮忙。

代码

bool cmp(const pair<int,int> &p1, const pair<int,int> &p2)
{
    return p1.second<p2.second;
}

int subsets(pair<int,int> time[], int p)
{
    if(p == 0)  return 1;
    int j = upper_bound(time, time+p, time[p], cmp) - time;
}


编辑:我已经更正了返回类型,但我似乎没有得到我想要的输出。
我有一个pair<int,int>命名时间数组,它包含分别作为第一个和第二个参数的开始和结束时间,并按照结束时间的增加方式排序。

现在我在索引p。我想找到数组的最大索引(= j),例如time[j].second <= time[p].first例如
time = {(1,5),(4,7),(6,12)}并且如果p = 2(0基于索引)那么j应该是= 0(因为5 <= 6但是7> 6)但是upper_bound给了我j = 2。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

您的cmp函数没有任何问题,当您尝试将std::upper_bound的返回值存储到int j时,会出现错误。

根据referencestd::upper_bound

  

返回指向范围[first,last]中大于value的第一个元素的迭代器,如果没有找到这样的元素,则返回last。

因此,要获取time数组中找到的元素的位置,您需要修改代码,如下所示:

int j = upper_bound(time, time + p, time[p], cmp) - time;

或等效地使用std::distance函数。

另外,不要忘记检查这样的元素是否存在(即在这种情况下std::upper_bound是否返回time + p

答案 1 :(得分:0)

以下代码可以完成工作:)

bool compareit(int n, pair<int,int> &p)
{
    return p.second > n;
}

int subsets(pair<int,int> time[], int p)
{
    if(p == 0)  return 1;
    int j = upper_bound(time, time+p, time[p].first, compareit) - time;
}