【问题标题】:Sorting a vector of class pointers based on two attributes?根据两个属性对类指针向量进行排序?
【发布时间】:2020-11-22 11:24:27
【问题描述】:

我正在尝试对类指针向量vector <Building*> company 进行排序。下面是我的代码

sort(company.begin(), company.end(), [] (Building* lhs, Building* rhs)
{
    return (lhs->getCompanyName() > rhs->getCompanyName() && lhs->height() > rhs->height());
}); 

我正在尝试根据名为getCompanyName()height() 的类中的两个属性进行排序。 getCompanyName 按字母顺序从 A 到 Z 排序,height 按降序排序。

上述排序不起作用。

但是,如果我将这两个条件分成以下两个:

sort(company.begin(), company.end(), [] (Building* lhs, Building* rhs)
{
    return lhs->getCompanyName() > rhs->getCompanyName();
}); 

sort(company.begin(), company.end(), [] (Building* lhs, Building* rhs)
{
    return lhs->height() > rhs->height();
}); 

向量将正确排序,但仅基于一个属性。

我的 2 属性排序代码有问题吗?

编辑:

getCompanyName() 将首先按 A-Z 排序。

只有在getCompanyName() 排序后,height() 才会按降序排序。

排序后的预期输出示例:

Company Name: AQA
Height: 300

Company Name: AFE
Height: 200

Company Name: BAC
Height: 600

Company Name: BFE
Height: 100

Company Name: CJE
Height: 1200

【问题讨论】:

  • 您如何定义用于排序的顺序?例如,哪个应该更早,getCompanyName = aaa, height = 100getCompanyName = bbb, height = 200
  • @MikeCAT 谢谢,我已进一步编辑我的帖子以澄清您的观点。
  • 您的比较不满足严格弱排序的要求,因此您的程序表现出未定义的行为。尤其是比较得出的等价关系是不传递的:{"b", 3}等价于{"c", 1},等价于{"a", 2},但{"b", 3}不等价于{"a", 2}

标签: c++ sorting c++11 conditional-statements


【解决方案1】:

如果你想first通过增加getCompanyName()的值和然后通过减少height()的值,你的谓词需要:

sort(company.begin(), company.end(), [] (Building* lhs, Building* rhs)
{
    return lhs->getCompanyName() < rhs->getCompanyName()    // increasing getCompanyName()
        || (lhs->getCompanyName() == rhs->getCompanyName()  // if equal getCompanyName() 
            &&  lhs->height() > rhs->height());             // then decreasing height()
}); 

【讨论】:

  • 没想到getCompanyName()的第二次排序还需要做相等比较。感谢您的详细解释。
  • 在您的问题中,您说“只有在对 getCompanyName() 进行排序后,才会对 height() 进行降序排序。”。这基本上就是这段代码正在做的事情:)
【解决方案2】:

典型的模式是:

return 
(lhs->getCompanyName() > rhs->getCompanyName()) || 
(lhs->getCompanyName() == rhs->getCompanyName() &&
    lhs->height() > rhs->height());

即:先按名称排序,如果名称相同,则按高度排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-09
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多