首页 > 解决方案 > 用 std::swap 交换二维数组中的行。它是如何工作的?

问题描述

我主要只是记录这个问题,因为有人可能会偶然发现它,并且可能会发现它很有用。而且,我非常好奇,如何std::swap在 2D 数组上工作,例如:Arr[10][10].

我的问题出现了,因为据我了解,这样的数组只是一个带有一些重新索引的一维数组。
供参考: 二维数组如何存储在内存中?

int main()
{
    const int x = 10;
    const int y = 10;
    int Arr[y][x];
    // fill the array with some elements...
    for (int i = 0; i < x*y; i++)
    {
        Arr[i / y][i % x] = i;
    }

    // swap 'row 5 & 2'
    // ??? how does swap know how many elements to swap?
    // if it is in fact stored in a 1D array, just the
    // compiler will reindex it for us
    std::swap(Arr[5], Arr[2]);

    return 0;
}

如果我们的数据类型是,我可以理解交换两个“行”,比如指向一个指针的指针,int** Arr2D然后交换,std::swap(Arr2D[2], Arr2D[5])因为我们不需要知道这里的长度,我们只需要交换两个指针,指向“一维数组” .
但是如何std::swap使用Arr[y][x]
是否使用循环来交换x长度内的所有元素?

标签: c++arraysmultidimensional-arrayswap

解决方案


std::swap对数组有一个重载,可以有效地交换每两个元素,再次使用std::swap.

至于大小信息,它嵌入在数组类型(Arr[i]is int[x])中,因此编译器知道推断 T2asintNas 10

OT:为什么可变长度数组不是 C++ 标准的一部分?但这种特殊情况是可以的


推荐阅读