对二重向量的向量进行排序

Sorting vector of vector of doubles

本文关键字:向量 排序 二重      更新时间:2023-10-16

我有以前集群的向量和当前集群的向量。一个簇有一个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与该比较器一起使用。

您可以尝试首先对"上"向量使用std::sort(第二个原型允许您定义"下"向量的排序方式),然后每次调用函数对象Comp时,对每个"下"方法再次使用std:∶sort(这次第一个原型就足够了)。

这也适用于你的第二个问题。