多维数组排序并保留索引 C++

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}

1
你真的在寻找一个“是”或“否”的答案吗? - R Sahu
2
@RSahu,我们可以说OP,_是的_,那就让我们去休眠吧 ^_^ - mazhar islam
2个回答

2

首先创建整数索引数组;这里是针对一维数组的:

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 );

最后,使用排序后的索引数组对值数组进行排序。

0

是的。要逐行排序,您必须在 sort 函数中设置适当的起始和结束点。为保留索引部分,您可以使用 make_pair 命令先创建数组元素和索引的对。执行上述代码后,您可以重构索引数组。

您需要像这样做(虽然我还没有尝试过):

for (i = 0; i < matrix.size(); i++)
{
  sort(matrix[i].begin(), matrix[i].end());
}

记得将索引作为一对中的第二个元素添加,因为对于一对,默认比较运算符会先检查第一个元素,然后是第二个元素。


这种排序方式是有效的,但我不知道如何做索引部分。 - Eli
@Eli:我也已经解释了索引部分。看看 make_pair 命令。因此,在排序时,数字将具有关于索引的信息,因为它们将成为一对。之后,使用.first.second命令,你可以提取值和索引。 - therainmaker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接