Сортировать векторы по большему количеству условий, чем один

Я спросил в другом посте о: my_old_post

Но теперь мне нужно более сложное условие для сортировки моего вектора.

У меня есть такой вектор: vector_points_original. Тогда, если я сортирую это для z каждой точки, у меня есть другой вектор как: vector_points_sorted_by_Z. Но мне нужно vector_sorted_by_z и после сортировки первые четыре точки и вторые четыре точки по компоненту y. Не могли бы вы помочь мне?

2 ответа

Решение
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);

Если вам нужно сохранить z заказ при заказе y, затем yComp = [](const auto& p1, const auto& p2) {return p1.y < p2.y && p1.z <= p2.z;};

Критически ли важна производительность? Если нет, просто разделите существующий вектор на два, отсортируйте по Y, а затем поместите результаты обратно в один вектор?

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());

?

Другие вопросы по тегам