对自定义对象的大std :: vector进行排序

时间:2019-01-18 15:12:11

标签: c++ sorting

我正在创建CSR格式的稀疏矩阵,为此我从矩阵元素结构的向量开始。首先需要将其设置为std :: vector,因为我不提前知道矩阵将有多少个非零值。然后,要为CSR矩阵填充适当的数组,我需要首先对这个非零数组进行排序,如果它们逐行通过,则它们按出现在矩阵中的顺序排列。但是,在一定的矩阵大小(大约为1 500 000非零)以上时,排序后的向量并不从矩阵的开头开始。它仍在排序,但从44000行开始。

// Matrix element struct:
struct mel
{
  int Ncols;
  int row,col;
  MKL_Complex16 val;
  void print();
};

// Custom function for sorting:
struct less_than_MElem
{
  inline bool operator() (const mel& ME1, const mel& ME2)
  {
    return ( ( ME1.row*ME1.Ncols+ME1.col ) <  ( ME2.row*ME2.Ncols+ME2.col ) );
  }
};

int main()
{
  std::vector<mel> mevec;
  /* long piece of code that fills up mevec */
  std::sort( mevec.begin(), mevec.end(), less_than_MElem() );

  return 0;
}

我认为也许随着向量的动态增长,它缠绕在内存中的单独块中,并且迭代器不再指向真正的开始/结束。因此,我尝试创建一个新的向量,并开始将其调整为当时已知的大小。然后将元素一一复制到此新向量中并进行排序,但结果相同。

Nelements = mevec.size();
std::vector<mel> nzeros;
nzeros.resize(Nelements);
for( int i = 0; i < Nelements; i++ )
{
  nzeros[i].Ncols = mevec[i].Ncols;
  nzeros[i].row = mevec[i].row;
  nzeros[i].col = mevec[i].col;
  nzeros[i].val = mevec[i].val;
}

  std::sort( nzeros.begin(), nzeros.end(), less_than_MElem() );

谁能想到解决方案?

0 个答案:

没有答案