2

我有这样一个向量:

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++

4

1 回答 1

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::tiefrom header<tr1/tuple>boost::tie. 您也可以cmp手动实现比较功能。这是一个很好的练习,但它既乏味又容易出错。

于 2013-08-26T06:26:50.373 回答