在C++中,是否可以使用sort对多维数组(逐行)进行排序,并保留索引?
例如:
13, 14, 5, 16
0, 4, 3, 2
7, 3, 7, 6
9, 1, 11, 12
Becomes:
{ 5,13,14,16}
{ 0,2,3,4 }
{ 3,6,7,7}
{ 1,9,11,12 }
那么带有索引的数组将会是:
{2,0,1,3}
{0,3,2,1}
{1,3,0,2}
{ 1,0,2,3}
在C++中,是否可以使用sort对多维数组(逐行)进行排序,并保留索引?
例如:
13, 14, 5, 16
0, 4, 3, 2
7, 3, 7, 6
9, 1, 11, 12
Becomes:
{ 5,13,14,16}
{ 0,2,3,4 }
{ 3,6,7,7}
{ 1,9,11,12 }
那么带有索引的数组将会是:
{2,0,1,3}
{0,3,2,1}
{1,3,0,2}
{ 1,0,2,3}
首先创建整数索引数组;这里是针对一维数组的:
int ind[arr.size()];
for( int i=0; i<arr.size(); ++i)
ind[i] = i;
然后创建比较对象。以下是C++99语言中的大致示例;对于C++11,您可以通过使用lambda来快捷处理:
struct compare
{
bool operator()( int left, int right ) {
return arr[left] < arr[right];
}
};
std::sort( ind, ind+sizeof(arr), compare );
是的。要逐行排序,您必须在 sort
函数中设置适当的起始和结束点。为保留索引部分,您可以使用 make_pair
命令先创建数组元素和索引的对。执行上述代码后,您可以重构索引数组。
您需要像这样做(虽然我还没有尝试过):
for (i = 0; i < matrix.size(); i++)
{
sort(matrix[i].begin(), matrix[i].end());
}
记得将索引作为一对中的第二个元素添加,因为对于一对,默认比较运算符会先检查第一个元素,然后是第二个元素。
make_pair
命令。因此,在排序时,数字将具有关于索引的信息,因为它们将成为一对。之后,使用.first
和.second
命令,你可以提取值和索引。 - therainmaker