我有这样一个载体:
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 ++
答案 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
。这是一个很好的练习,但它既乏味又容易出错。