Doo*_*ggy 8 c++ sorting stl qsort
假设我有一个A大小的方阵n,定义为a std::vector<double>.
std::vector<double> A(n*n);
Run Code Online (Sandbox Code Playgroud)
矩阵的元素以通常的方式访问:
double a_ij = A[i*n + j];
Run Code Online (Sandbox Code Playgroud)
我需要按照相对于第一列的升序对矩阵的行进行排序.
qsort函数允许我使用数组和函数指针来完成它,但我想找到一种方法来实现这一点,使用向量和std::sort.
另外,请注意,出于性能原因,我不希望将矩阵定义为向量矢量.
编辑:
我传递给qsort的函数:
static int comparisonFunction(const void* firstRow, const void* secondRow)
{
if (((double *)firstRow)[0] < ((double *)secondRow)[0]) return -1;
else if (((double *)secondRow)[0] < ((double *)firstRow)[0]) return 1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
电话:
std::qsort(matrixArray, nbRows, sizeof(double)*nbRows, comparisonFunction);
Run Code Online (Sandbox Code Playgroud)
可以替换qsort为std::sort对底层数组进行排序,但您必须定义:
这取决于您,但标准 C++ 的所有版本都明确支持 C 库,因此qsort在此用例中使用没有任何害处,因为它更简单并且最终更不容易出错。该qsort方式仅需要7条线,易于控制和同行评审。好的C++ 方法将需要至少 2 个具有重要构造函数的类,因此行数更多,并且其中出错的可能性也更多。
如果您确实无法使用qsort,也许对于内部编码规则,那么我只需将数据复制到向量的向量中,对其进行排序并将数据复制回初始向量。它涉及矩阵的 2 个额外完整副本,但至少使用标准类并且需要少得多的编码。