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

时间:2019-01-25 19:58:46

标签: c++ algorithm set

我正在使用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'和'double') 编译器错误降至第二个下限:没有匹配的成员函数来调用“ lower_bound”

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

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;
}

1 个答案:

答案 0 :(得分:4)

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

您需要将MyObject传递到nset.lower_bound进行搜索。