我想在对数组上使用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。
我怎样才能做到这一点?
答案 0 :(得分:1)
您的cmp
函数没有任何问题,当您尝试将std::upper_bound
的返回值存储到int j
时,会出现错误。
根据reference,std::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;
}