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
, 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:
#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/