基于类中的变量对向量进行排序

3
我有一个类,其中包含一个类型为int的变量。我创建了一个向量,并将此类存储在其中,现在需要对其进行排序。我的问题在于,我需要按升序使用存储在此类中的int值对向量进行排序。
我查看了内置于C++中的std::sort()类,但似乎无法使其正常工作。我还查看了堆栈溢出等贴子,如Sorting a vector of custom objects,并尝试使用它们,但都没有成功。
顺便说一下,这是我的第一篇帖子,如果我做错了什么,请告诉我,以便我可以纠正问题。
2个回答

14
如果您有一个类对象的向量
std::vector<MyClass> objs;

排序的变量是

MyClass.value

然后你就可以了

std::sort(objs.begin(),
          objs.end(),
          [](const MyClass& lhs, const MyClass& rhs)
{
    return lhs.value < rhs.value;
});

我尝试过这个代码 "std::sort(NodeList.begin(), NodeList.end(), [](const Node& lhs, const Node& rhs){ lhs.F < rhs.F; });",但是在运行程序时出现了错误。错误信息为 "'!' : illegal on operands of type 'void'" 和 "see reference to function template instantiation 'std::pair<_RanIt,_RanIt> std::_Unguarded_partition<_RanIt,_Pr>(_RanIt,_RanIt,_Pr)'"。 - Crimson
你缺少了 return 关键字。 - Cory Kramer
做到了,非常感谢。不过,您能否解释一下第三个参数的作用,这样我就可以从中学习了吗? - Crimson
第三个参数是一个lambda表达式,我使用它来避免像SingerOfTheFail的compare函数那样创建比较仿函数。这是一个无名的内部函数。 - Cory Kramer

8

您只需要为该类实现一个operator<,或者为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)
}

如果您正在使用c++11,您还可以提供一个lambda作为比较函数:
std::sort(vec.begin(), vec.end(), [](MyClass & one, MyClass & two){return one.i < two.i;});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接