Trier les vecteurs

j’ai

vector<vector> vec 

dans mon application c ++.

Chaque vecteur d’entiers en tant qu’élément du “grand” vecteur a 4 valeurs INT. Je veux sortinger vec en fonction de la troisième valeur de son contenu vecteurs de contenu (je veux dire chaque troisième élément vectoriel “à l’intérieur”) – est-ce possible?

MODIFIER

Disons que j’ai une fonction

 COST(vector) 

qui me calcule une valeur en fonction de mes valeurs vectorielles – puis-je aussi l’utiliser en paramètre de comparaison? Cela m’aiderait beaucoup plus.

Bien sûr que ça l’est. std::sort peut prendre un troisième paramètre qui est la fonction de comparaison à utiliser lors du sorting. Par exemple, vous pouvez utiliser une fonction lambda:

 std::vector> vec; // Fill it std::sort(vec.begin(), vec.end(), [](const std::vector& a, const std::vector& b) { return a[2] < b[2]; }); 

Alternativement, vous pouvez passer tout autre object appelable avec signature bool(const std::vector&, const std::vector&) , tel qu'un pointeur de fonction ou un foncteur.


Réponse à modifier: Appliquez simplement votre fonction COST à a et b :

 std::sort(vec.begin(), vec.end(), [](const std::vector& a, const std::vector& b) { return COST(a) < COST(b); }); 

Si vous voulez comparer les deux vecteurs par coût, essayez ceci:

 bool predicate(const std::vector& a, const std::vector& b) { return COST(a) < COST(b); } 

Remarques:

  • Ce qui précède fonctionne avec C ++ 98 également. Je ne suis pas certain de l’ampleur de l’utilisation de C ++ 11 et de la présence d’un compilateur conforme. Sinon, vous pouvez bien sûr utiliser une expression lambda, comme le suggère sftrabbit.
  • Vous ne dites pas ce que revient COST, j'ai simplement supposé une valeur sortingable comme float ou long.
  • J'espère que vous ne copiez pas le vecteur en le passant à COST (), ce serait terriblement inefficace.
  • COST suggère une macro, comme tous les UPPERCASE_NAMES. N'utilisez pas de macros. N'utilisez pas de noms de macro pour les fonctions.
 #include  #include  #include  #include  using namespace std; // This makes the sort be according to column 2 and ascending bool sortFunc( const vector& p1, const vector& p2 ) { return p1[1] < p2[1]; } int main() { srand(time(NULL)); // Creates and initializes 10 x 4 vector vector< vector > vec; for( int i=0; i<10; i++ ) { vector tmpVec; for( int j=0; j<2; j++ ) { tmpVec.push_back( rand()%10 ); } vec.push_back( tmpVec ); } // Print out the pre-sorted vector cout << "Pre-sorting state:" << endl; for( int i=0; i 

source: https://shihho.wordpress.com/2012/11/28/sort_with_vectors/