基于列对基于1D std :: vector的Matrix进行排序

时间:2016-10-27 03:02:09

标签: c++

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

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

1 4

根据第1列进行排序后,它应如下所示:

1 4

2 3

基本上,由于1 <2,我们进行了行交换。我知道如果m_matrix是2D矢量,那么std::sort就可以了。是否有可能基于所选列实现基于1D std :: vector的矩阵排序。

以下对于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);
    }

};

1 个答案:

答案 0 :(得分:0)

解决方案非常简单。请记住std::sort采用开始和结束迭代器。因此,您所要做的就是将矩阵分成几部分并对它们进行单独排序:

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

<强>注意事项: 如果您的矩阵在column-major order中展平,这将有效。否则,如果它在行专业中,您只需转置矩阵,使用上面的代码对其进行排序,然后将其转置回来。我想如果你想避免编写自己的排序功能,这是唯一的方法。 但是,如果您只想对单个列进行排序,并且您的矩阵按行主要顺序排列,那么将该行复制到新的向量,将其排序要便宜得多,并将其复制回来。

是的,我不明白为什么m_matrix是一个指针...这是非常糟糕的做法,并且是对内存泄漏的欢迎邀请(除非您使用智能包装它的指针,例如std::unique_ptr)。

希望这会有所帮助。干杯!