2017-03-17 3 views
0

j'ai demandé dans d'autres à propos de poste: my_old_postvecteurs Trier par des conditions plus que l'un

Mais maintenant je besoin état plus complexe pour trier mon vecteur.

J'ai un vecteur comme ceci:vector_points_original. Ensuite, si je le trier pour z de chaque point, j'ai un autre vecteur comme: vector_points_sorted_by_Z. Mais j'ai besoin vector_sorted_by_z et après trier les quatre premiers points et le deuxième quatre points par composant y. Pourriez-vous m'aider?

+0

S'il vous plaît afficher le texte ici au lieu d'afficher un lien vers une image du texte. –

Répondre

0
std::vector<CartesianPoint>v{...};//place your values here  
//First, sort by Z  
std::sort(v.begin(), v.end(), [](const auto& p1, const auto& p2){return p1.z < p2.z;}); 
//Define a compare-by-y lambda 
auto yComp = [](const auto& p1, const auto& p2){return p1.y < p2.y;}; 
//Use yComp for first 4 v[] 
std::sort(v.begin(), v.begin() + 4, yComp); 
//And for the second 
std::sort(v.begin() + 4, v.begin() + 8, yComp); 

Si vous devez enregistrer z pour en réorganisant par y, puis yComp = [](const auto& p1, const auto& p2) {return p1.y < p2.y && p1.z <= p2.z;};

0

Est-ce que la performance est critique? Si ce n'est pas le cas, divisez votre vecteur existant en deux, triez par Y, puis placez les résultats dans un seul vecteur.

std::vector<Point3d> sortedByZ; 
std::vector<Point3d> firstFour(sortedByZ.begin(), sortedByZ.begin() + 4); 
std::vector<Point3d> lastFour(sortedByZ.begin() + 5, sortedByZ.end()); 

// Sort firstFour and lastFour independently 

sortedByZ = firstFour; 
sortedbyZ.insert(sortedByZ.end(), lastFour.begin(), lastFour.end()); 

?

+0

Merci à tous, cela fonctionne bien. –