sortinger le vecteur multidimensionnel par 1ère colonne

Je souhaite sortinger rapidement un vecteur multidimensionnel en fonction des données de la première ligne. Il existe des moyens de le faire (voir les réponses à ce message) mais je cherche un moyen rapide et efficace sans utiliser C ++ 11 vecteurs). J’essayais de voir si Boost avait une fonctionnalité de sorting intéressante comme celle de C ++ 11, mais je suis novice en C ++ et incapable de le comprendre. En gros, j’ai des données qui ressemblent à:

std::vector<std::vector > data(2, std::vector(5, 0.0)); data[0][0] = 2.0; data[1][0] = 4.0; data[0][1] = 1.0; data[1][1] = 6.0; data[0][2] = 3.0; data[1][2] = 5.0; data[0][3] = 2.1; data[1][3] = 3.3; data[0][4] = 0.3; data[1][4] = 5.7; 

et je veux sortinger les données afin que je

 data[0][0] = 0.3; data[1][0] = 5.7; data[0][1] = 1.0; data[1][1] = 6.0; data[0][2] = 2.0; data[1][2] = 4.0; data[0][3] = 2.1; data[1][3] = 3.3; data[0][4] = 3.0; data[1][4] = 5.0; 

Notez que j’utilise des vecteurs car je ne connais pas à l’avance les dimensions des données. Toutefois, les données seront rectangulars et bien plus grandes que l’exemple 2×5 fourni ici.

D’abord, déclarez un foncteur:

 struct FirstColumnOnlyCmp { bool operator()(const std::vector& lhs, const std::vector& rhs) const { return lhs[0] < rhs[0]; } }; 

Ensuite, utilisez-le dans votre invocation std::sort :

 std::sort(data.begin(), data.end(), FirstColumnOnlyCmp()); 

C'est tout. C ++ 11 n’est pas requirejs, il facilite simplement beaucoup de choses puisque vous pouvez faire tout cela dans un lambda plutôt que dans un foncteur.

Je vous laisse le soin de vous assurer que tous les vecteurs de la collecte de data comportent au moins un élément permettant d'éviter d'appeler UB (je suppose qu'ils le font, sinon votre logique de comparaison risque d'être un peu plus compliquée.