【问题标题】:sorting a vector of classes based on a variable in the class [duplicate]根据类中的变量对类向量进行排序[重复]
【发布时间】:2015-06-22 22:39:18
【问题描述】:

我有一个类,其中存储了一个int 类型的变量。然后我创建了一个包含这个类的向量,然后我需要对其进行排序。 然而,我的问题源于我需要使用存储在此类中的 int 值以升序对向量进行排序。

我查看了 C++ 中内置的 std::sort() 类,但似乎无法使其正常工作。我还看过Sorting a vector of custom objects等帖子 并尝试使用此功能,但无济于事。

顺便说一句,这是我的第一篇文章,所以如果我做错了什么,请告诉我,以便我可以纠正问题。

【问题讨论】:

    标签: c++ class sorting vector


    【解决方案1】:

    如果你有你的类对象的向量

    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 std::_Unguarded_pa​​rtition<_ranit>(_RanIt,_RanIt,_Pr)'”
    • 您缺少 return 关键字
    • 做到了,谢谢大家,但是您能解释一下第三个参数的作用,以便我可以从中学习吗?
    • 第三个参数是 lambda expression,我使用了它,所以我不必像 SingerOfTheFail 的 compare 函数那样制作比较函子。这是一个无名的就地函数。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 2015-09-03
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 2011-01-23
      相关资源
      最近更新 更多