在C++中对一组对象使用lower_bound()

Using lower_bound() with a set of objects in C++

本文关键字:lower bound 对象 一组 C++      更新时间:2023-10-16

我在C++中使用一组对象来获取插入和查找的log(n)次。在下面的代码中,我可以插入元素并使它们按x属性排序,但是,我不能使用lower_bound来查找基于同一属性的下限。我不知道该怎么解决。任何帮助都将不胜感激。

我能找到的关于集合的大多数例子都不是关于一组对象

struct MyObject {
float x = 0;
float y = 0;    
const bool operator < ( const MyObject &r ) const{
return ( x< r.x);
}
};
set<MyObject> nset;
int main(){
MyObject n1;
n1.x=5;
n1.y=1;
MyObject n2;
n2.x=3;
n2.y=2;
nset.insert(n1);
nset.insert(n2);
// this works, the elementes are sorted according to x
for(auto elem: nset){
cout << elem.x << endl; 
}
// this doesn't work
set<MyObject>::iterator it = lower_bound(nset.begin(), nset.end(), 1.2);
cout << it->x << endl;
//neither this one
//    set<MyObject>::iterator it = nset.lower_bound(1.2);
//    cout << it->x << endl;
cout << "hello" << endl;
return 0;
}

我希望下界函数将我指向对象集中的下界"x",但代码无法编译。第一个下界的编译器错误表示:二进制表达式的操作数无效("const-MyObject"answers"double")第二个下界的编译器错误表示:调用"lower_bound"没有匹配的成员函数

编辑:而用户提供的答案:1201ProgramAlarm对我理解和修复错误很有帮助。我仍然认为在我的情况下,有一个接受浮点而不是对象的下界函数更方便。因此,我实现了以下功能来帮助我实现这一点。复制如下,以防其他人感兴趣:

set<MyObject>::iterator mylower_bound(set<MyObject> &myset, float val){    
MyObject f;
f.x = val;
set<MyObject>::iterator it = myset.lower_bound(f);   
return it;
}

nset存储MyObject对象,而lower_bound需要存储在集合中的一个对象。您传递的是1.2,它是一个double,但没有办法从double构造MyObject。因此编译失败。

您需要将MyObject传递给nset.lower_bound才能进行搜索。