У меня есть вектор предыдущих кластеров и вектор текущих кластеров. Кластер имеет вектор 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 );
}
}
ПРИМЕЧАНИЕ: это отвечает на вопрос так, как он был изначально написан (и как он все еще написан в заголовке). Основная часть вопроса была изменена, чтобы сделать ее недействительной, но ответ все еще может быть полезен для сортировки вектора векторов.
Во-первых, вам нужно решить, что означает сортировка одного вектора перед другим, и написать компаратор:
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
с этим компаратором.
Вы можете попробовать использовать станд :: сортировать сначала по «верхнему» вектору (второй прототип позволяет вам определить способ сортировки «нижних» векторов) сначала, а затем каждый раз, когда вызывается ваш функциональный объект Comp, снова используйте std :: sort для каждого «нижнего» метода (на этот раз достаточно первого прототипа).
Это также может работать для вашего второго вопроса.