简体   繁体   中英

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

I'm using a set of objects in C++ to get log(n) times for inserting and finding. In the code below I'm able to insert elements and make them ordered by x attribute, however, I'm not able to use lower_bound to find the lower bounds based on the same attribute. I don't know how to fix that. Any help will be appreciated.

Most of the examples on sets that I could find were not about a set of objects

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

I want the lower bound function to point me to the lower bound "x" in the set of objects but the code fails to compile. Compiler error to the first lower bound says: Invalid operands to binary expression ('const MyObject' and 'double') Compiler error to the second lower bound says: No matching member function for call to 'lower_bound'

EDIT: while the answer provided by user: 1201ProgramAlarm was quite helpful for me to understand and fix the error. I still think it is more convenient in my case to have a lower_bound function that accepts floats rather than objects. So I have implemented the following function to help me achieve that. Copied below just in case others were interested:

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 stores MyObject objects, and lower_bound needs one of the thing stored in the set. You're passing it 1.2 , which is a double, but there is no way to construct a MyObject from a double. Thus the compilation failure.

You'll need to pass a MyObject to nset.lower_bound to do your search.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM