sorting a vector of classes based on a variable in

2019-06-14 15:36发布

This question already has an answer here:

I have a class in which there is a variable of type int stored inside. I have then created a vector which holds this class in it, which I then need to sort. My problem however stems from the fact that I need to sort the vector using the values of the int stored inside of this class in accending order.

I have looked at the std::sort() class built into C++ but cannot seem to get this to work. I have also looked at posts such as, Sorting a vector of custom objects and have tried to use this, but with no avail.

As a side note, this is my first post, so if I am doing anything wrong, please let me know so that I can rectify the problem.

2条回答
对你真心纯属浪费
2楼-- · 2019-06-14 16:08

If you have a vector of your class object

std::vector<MyClass> objs;

And the variable to sort by is

MyClass.value

Then you can

std::sort(objs.begin(),
          objs.end(),
          [](const MyClass& lhs, const MyClass& rhs)
{
    return lhs.value < rhs.value;
});
查看更多
一纸荒年 Trace。
3楼-- · 2019-06-14 16:23

You just need to either implement an operator< for the class, or provide a comparison function for the std::sort:

class MyClass
{
public:
    MyClass(int val) : i(val){}
    bool operator<(const  MyClass & other) //(1)
    {
        return i < other.i;
    }

    int i;
};

bool compare(const MyClass & l, const MyClass & r) //(2)
{
    return l.i < r.i;
}


int main( int argc, char *argv[] )
{
    std::vector<MyClass> vec;
    vec.push_back(MyClass(5));
    vec.push_back(MyClass(1));
    vec.push_back(MyClass(3));
    std::sort(vec.begin(), vec.end());//works if operator < is present (1)
    std::sort(vec.begin(), vec.end(), compare);//works if comparison function is present (2)
}

If you are using c++11, you can also provide a lambda as a comparison function:

std::sort(vec.begin(), vec.end(), [](MyClass & one, MyClass & two){return one.i < two.i;});
查看更多
登录 后发表回答