基于列的一维std::矢量矩阵排序
Sorting 1D std::vector based Matrix based on columns
我有一个矩阵类如下(为了清晰起见省略了一些部分):
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);}
我想有一个函数来排序基于所选列的矩阵。假设矩阵是:
23
41
根据第一列排序后应该是这样的:
412
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
)。
希望这对你有帮助。干杯!
相关文章:
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- STL算法函数在多个一维容器上的使用
- 将二维数组的所有元素插入到一维数组中
- C++语法差异:二维和一维数组(指针算术)
- 将一维数组写入 CSV C++中的不同列?
- C++:将矩阵存储在一维数组中
- 当表示为对象的一维向量时,有效地旋转 NxM 矩阵 (C++)
- 如何在一维数组中的每个元素中都有多个int值
- 以C++填充一维数组
- 一维阵列的运动检测(神经网络或其他选项?
- 编写所需的代码以创建动态一维整数数组
- 用于在一维数组上嵌套循环操作的正确 openmp 指令
- 使用两个不同大小的一维阵列制作 2D 阵列
- 如何在 <threads> c++ 中使用和一维数组进行矩阵乘法?
- C++按内存地址将多维数组更改为一维数组
- 在 c++ 中返回一维数组时出错
- 新的一个一维阵列,非常大,例如60000*60000
- 在一维数组中对二维进行排序
- 如何定义一个自定义比较函数来按照一维数组排序对矩阵进行排序
- 基于列的一维std::矢量矩阵排序