Сортировка вектора вектора чисел

У меня есть вектор предыдущих кластеров и вектор текущих кластеров. Кластер имеет вектор 2D Point2F, я хотел бы отсортировать эти кластеры по возрастанию на основе расстояния между каждым кластером, которое хранится в векторе расстояний, или вы можете предложить лучший способ сортировки вектора кластеров?

 distances.resize(previousClusters.size()*currentClusters.size());
for (int i=0; i<previousClusters.size()*currentClusters.size(); i++)
{
distances[i].resize(previousClusters.size()*currentClusters.size());
}

for (int i=0; i< previousClusters.size(); i++)
{

for(int j=0; j < currentClusters.size(); j++)
{

distances[i][j] = cv::norm(previousClusters[i].m_Properties.m_Center - currentClusters[j].m_Properties.m_Center );
}
}

0

Решение

ПРИМЕЧАНИЕ: это отвечает на вопрос так, как он был изначально написан (и как он все еще написан в заголовке). Основная часть вопроса была изменена, чтобы сделать ее недействительной, но ответ все еще может быть полезен для сортировки вектора векторов.

Во-первых, вам нужно решить, что означает сортировка одного вектора перед другим, и написать компаратор:

struct compare_distance_vectors {
bool operator()(std::vector<double> const & v1, std::vector<double> const & v2) {
// implement your comparison here.
// return "true" if v1 should come before v2.
}
};

Тогда используйте std::sort сортировать в соответствии с этим порядком:

std::sort(vectors.begin(), vectors.end(), compare_distance_vectors());

Если вы хотите лексикографический упорядочение (то есть упорядочение по первому элементу, затем по второму, если оно равно и т. д.), тогда вы можете использовать компаратор по умолчанию (который std::less<value_type>и использует < сравнивать):

std::sort(vectors.begin(), vectors.end());

Как правило, для сортировки последовательности любого типа (например, std::vector<cv::Point2f>) в соответствии с любым порядком, напишите такой компаратор, чтобы указать порядок, а затем используйте std::sort с этим компаратором.

4

Другие решения

Вы можете попробовать использовать станд :: сортировать сначала по «верхнему» вектору (второй прототип позволяет вам определить способ сортировки «нижних» векторов) сначала, а затем каждый раз, когда вызывается ваш функциональный объект Comp, снова используйте std :: sort для каждого «нижнего» метода (на этот раз достаточно первого прототипа).

Это также может работать для вашего второго вопроса.

-1