我有一个矩阵类如下(为清楚起见,省略了一些部分):
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);
}
};
答案 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
)。
希望这会有所帮助。干杯!