基于列的一维std::矢量矩阵排序

Sorting 1D std::vector based Matrix based on columns

本文关键字:排序 一维 std 于列      更新时间:2023-10-16

我有一个矩阵类如下(为了清晰起见省略了一些部分):

template <typename T> class CMatrix{
protected:
   vector<T>* m_matrix;
public:
void SetCellValue(unsigned int row,unsigned int col,T value){ m_matrix->at(row*m_column+col)=value;}
T& GetCellValue(unsigned int row,unsigned int column) const{return m_matrix->at(row*m_column+column);}

我想有一个函数来排序基于所选列的矩阵。假设矩阵是:

2

3

4

1

根据第一列排序后应该是这样的:

4

12

3

基本上,从1<2开始,我们执行了一个行交换。我知道如果m_matrix是一个二维向量,那么std::sort是可行的。是否有可能实现基于std::向量的一维矩阵的排序,基于所选的列。

下面的代码对于1D数据类型工作得很好,但不能调整它来处理矩阵:

template <typename T> class Sorter{
    bool m_IsAscending;
public:
    Sorter() {m_IsAscending=true;}
    void SortAscending() {m_IsAscending=true;}
    void SortDescending(){m_IsAscending=false;}
    bool operator()(T i, T j){
        if(m_IsAscending) return (i<j); else return (i>j);
    }
};

解决方法很简单。记住,std::sort接受begin和end迭代器。所以你所要做的就是把你的矩阵分成几个部分,然后分别排序:

for(long i = 0; i < num_of_columns; i++)
{
    std::sort(m_matrix->begin()+num_of_rows*i, m_matrix->begin()+num_of_rows*(i+1));
}

这将对所有单独的列进行独立排序。如果您只想对一列进行排序,不要使用循环,并选择作为您想要排序的列号的i

事项:如果您的矩阵是按列主顺序平坦化的,这将有效。否则,如果它是行为主的,你所要做的就是对矩阵进行转置,用上面的代码进行排序,然后再转置回去。我想如果你想避免编写自己的排序函数,这是唯一的方法。然而,如果你只想对一列进行排序,而你的矩阵是按行为主顺序排列的,那么将这行复制到一个新的向量,对其排序,然后复制回来会便宜得多。

顺便说一句,我不明白为什么m_matrix是一个指针…这是一个非常糟糕的做法,并且会导致内存泄漏(除非您使用智能指针来包装它,例如std::unique_ptr)。

希望这对你有帮助。干杯!