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::tiebool operator<引数への左辺値参照のタプルを返し、これらのタプルの 2 つを比較する辞書編集的より小さい比較があります。StatFacesその効果は、2 つのインスタンス間で辞書編集的比較よりも少ない比較を実行することです。std::sortこれは、要素をソートするために内部的に使用されます。

注:std::tieは C++11 実装で使用できます。C++11 標準ライブラリの実装がない場合は、std::tr1::tiefrom header<tr1/tuple>またはboost::tie. cmp比較機能を手動で実装することもできます。これは良い練習ですが、退屈でエラーが発生しやすくなります。

于 2013-08-26T06:26:50.373 に答える