按多列对 Vecor 进行排序
Posted
技术标签:
【中文标题】按多列对 Vecor 进行排序【英文标题】:Sorting Vecor by multiple columns 【发布时间】:2016-05-04 20:51:26 【问题描述】:我正在尝试按多列对向量进行排序。所以这是我的向量,其中行是行数。因为我在 for 循环中使用不同大小的向量,所以它必须是动态的。
vector<vector<double> > matrix;
matrix.resize(rows);
for(size_t i=0; i<rows; i++)
matrix[i].resize(3);
向量设置好后,我用数据填充它。数据由坐标(xyz)组成。
for(size_t i = 0;i<lss.size();i+2)
int k = i+1;
matrix[i][0]=lss[i].v[0].x;
matrix[i][1]=lss[i].v[0].y;
matrix[i][2]=lss[i].v[0].z;
matrix[k][0]=lss[i].v[1].x;
matrix[k][1]=lss[i].v[1].y;
matrix[k][2]lss[i].v[1].z;
到目前为止一切正常。但接下来我必须对向量进行排序。我从我的数据中知道的是,对于一个循环通道,z 坐标总是相同的。所以我必须先按向量排序,然后再按第二列排序。我已经在搜索排序函数,例如 std:sort,但找不到合适的。我的尝试是这样的:
int compare(vector<double>& s1, vector<double>& s2)
return s1[0] < s2[0];
std::sort(matrix.begin(), matrix.end(), compare);
但结果与输入相同。
所以未排序的输出如下所示:
X=-5.000000, Y=2.000000, Z=-2.000000
X=-5.000000, Y=-5.000000, Z=-2.000000
X=5.000000, Y=5.000000, Z=-2.000000
X=5.000000, Y=-2.000000, Z=-2.000000
X=5.000000, Y=-2.000000, Z=-2.000000
X=5.000000, Y=-5.000000, Z=-2.000000
X=5.000000, Y=5.000000, Z=-2.000000
X=2.000000, Y=5.000000, Z=-2.000000
X=2.000000, Y=5.000000, Z=-2.000000
X=-5.000000, Y=5.000000, Z=-2.000000
X=5.000000, Y=-5.000000, Z=-2.000000
X=-2.000000, Y=-5.000000, Z=-2.000000
X=-2.000000, Y=-5.000000, Z=-2.000000
X=-5.000000, Y=-5.000000, Z=-2.000000
我想要的是:
X=-5.000000, Y=-5.000000, Z=-2.000000
X=-5.000000, Y=-5.000000, Z=-2.000000
X=-5.000000, Y=2.000000, Z=-2.000000
X=-5.000000, Y=5.000000, Z=-2.000000
X=-2.000000, Y=-5.000000, Z=-2.000000
X=-2.000000, Y=-5.000000, Z=-2.000000
X=2.000000, Y=5.000000, Z=-2.000000
X=2.000000, Y=5.000000, Z=-2.000000
X=5.000000, Y=-5.000000, Z=-2.000000
X=5.000000, Y=-5.000000, Z=-2.000000
X=5.000000, Y=-2.000000, Z=-2.000000
X=5.000000, Y=-2.000000, Z=-2.000000
X=5.000000, Y=5.000000, Z=-2.000000
X=5.000000, Y=5.000000, Z=-2.000000
【问题讨论】:
比较函数的返回类型应该是bool
。但这不应该阻止排序工作。请发布 MCVE,可以复制粘贴、编译和运行。
【参考方案1】:
由于您要根据前两列进行排序,因此比较函数需要使用这两个值。另外,将compare
的返回类型更改为bool
以及const&
的参数类型。
bool compare(vector<double> const& s1, vector<double> const& s2)
// If the values of the first column are not equal,
// just use them to order s1 and s2.
if ( s1[0] != s2[0] )
return s1[0] < s2[0];
// If the values of the first column are equal,
// use the values of the second column to order s1 and s2.
return s1[1] < s2[1];
【讨论】:
谢谢,我试过你的建议,效果很好。以上是关于按多列对 Vecor 进行排序的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Laravel 5.1 中按多列对 Illuminate Collection 进行排序?