如何用多数据对矢量进行排序?

时间:2013-08-26 06:23:42

标签: c++ algorithm sorting vector

我有这样一个载体:

struct StatFaces
{
    std::string faceName_1;
    std::string faceName_2;
    float percentagePerson ;
};

std::vector<StatFaces> listFaces_;

我想对那个矢量进行排序。但是我想用组对它进行排序。例如..

I have faceName_1 = john , faceName_2 = kate , percentagePerson = %90
       faceName_1 = john , faceName_2 = nastia , percentagePerson = %95
       faceName_1 = bill , faceName_2 = jamie , percentagePerson = %91 
       faceName_1 = bill , faceName_2 = anna , percentagePerson = %72

output should be ; 

faceName_1 = bill , faceName_2 = jamie, percentagePerson = %91
faceName_1 = bill , faceName_2 = anna , percentagePerson = %72
faceName_1 = john , faceName_2 = nastia , percentagePerson = %95
faceName_1 = john , faceName_2 = kate , percentagePerson = %90

排序算法必须将firstName_1分组,然后根据percentagePerson

进行排序

Ps:我不擅长c ++

1 个答案:

答案 0 :(得分:7)

您可以将自定义比较功能传递给std::sort。使用std::tie

可以轻松实现这一点
#include <tuple> // for std::tie

bool cmp(const StatFaces& lhs, const StatFaces& rhs)
{
  return std::tie(lhs.face_name1, lhs.percentagePerson, lhs.faceName_2) <
         std::tie(rhs.face_name1, rhs.percentagePerson, rhs.faceName_2);
}

然后

#include <algorithm> // for std::sort

std::sort(listFaces_.begin(), listFaces_.end(), cmp);

std::tie返回一个对参数的左值引用元组,并且有一个字典小于比较bool operator<,它比较了这些元组中的两个。结果是您在两个StatFaces个实例之间执行了一个小于词典的比较。 std::sort在内部使用它来对元素进行排序。

注意:std::tie在C ++ 11实现中可用。如果您没有C ++ 11标准库实现,则可以使用标题std::tr1::tie<tr1/tuple>中的boost::tie。您也可以手动实现比较函数cmp。这是一个很好的练习,但它既乏味又容易出错。