0

如何使用交换更改数组的 2 行数据。我编写了基本的更改代码,但我想通过将其更改为一行来提高性能(使用交换功能或本页底部的类似功能)。我的主要代码:

   int i,j;
    int A[50][4];
    i=5;
    j=21;
 //line 5   
    int t1 = A[j][0];
    int t2 = A[j][1];
    int t3 = A[j][2];
    int t4 = A[j][3];

    A[j][0]=A[i][0]  ;
    A[j][1]=A[i][1]  ;
    A[j][2]=A[i][2] ;
    A[j][3]=A[i][3] ;

    A[i][0] = t1;
    A[i][1] = t2;
    A[i][2] = t3;
    A[i][3] = t4;
//line 18

我要更改的内容:将第 5-18 行更改为以下内容之一:

A[i][] = A[j][];

或者

swap (A[i] , A[j])
4

4 回答 4

5

只需使用std::swap,它对数组有重载。在你的情况下:

std::swap( A[i] , A[j] );

请注意, is 的类型A[i]非常int[4]适合该重载。

编辑:如果您不能使用 C++11 功能,std::swap_ranges可以选择:

std::swap_ranges( A[i] , A[i] + 4 , A[j] );
于 2013-08-21T10:37:41.773 回答
0

不要交换只是循环执行:

for (int p=0; p<4; p++) {
    int t = A[j][p];
    A[j][p] = A[i][p];
    A[i][p] = t;
}
于 2013-08-21T10:37:26.607 回答
0

使用另一个最适合您需要的数据结构,我建议使用指针数组

int* A[4]; for (int i = 0; i < sizeof(A) / sizeof(A[0]);++i) {A[i] = new int[50];}

使用这种技术,您可以通过交换指针轻松交换行)

于 2013-08-21T10:40:32.567 回答
-1

如果您想提高性能,这是最快的交换操作,比标准 C++ 编译器上运行的 stl::swap 更快。

template<typename T=int>
void swap(T* p, T* q, int size)
{
    T* ptmp = new T[size];
    memcpy(ptmp, p, sizeof(T)*size);
    memcpy(p, q, sizeof(T)*size);
    memcpy(q, ptmp, sizeof(T)*size);
    delete[] ptmp;
}

您可以通过用(int*)alloca(sizeof(int)*size)替换对 new 的调用并注释掉删除来使其更快。但是 alloca 有点受限,因为它使用函数堆栈。好的,你可以这样称呼它:

 //line 5 
    swap(A[j], A[i]);

    //int t1 = A[j][0];
    // ... 

//line 18

这是来自 std::swap() 的文档:

非数组:常量:只执行一个构造和两个赋值(尽管每个操作都有其自身的复杂性)。

数组:N 中的线性:对每个元素执行交换操作。

由于此 swap() 对内存块执行操作,而不是逐个元素地执行操作,因此它比 std::swap() 更好。我已经使用 AQtime 确认了结果。

对于任何考虑“空间局部性、缓存未命中、缓存对齐、缓存友好等等等等…… ”的人来说,这里是给他们的:

memcpy 实现通常使用 SIMD 指令编写,这使得一次可以洗牌 128 位。SIMD 指令是汇编指令,可以对最长 16 字节的向量中的每个元素执行相同的操作。这包括加载和存储指令。

对于感到困惑的人,以下是 Microsoft 在实用程序头文件 VC 2012 中实现 std::swap() 的方式

        // TEMPLATE FUNCTION swap
template<class _Ty,
    size_t _Size> inline
    void swap(_Ty (&_Left)[_Size], _Ty (&_Right)[_Size])
    {   // exchange arrays stored at _Left and _Right
    if (&_Left != &_Right)
        {   // worth swapping, swap ranges
        _Ty *_First1 = _Left;
        _Ty *_Last1 = _First1 + _Size;
        _Ty *_First2 = _Right;
        for (; _First1 != _Last1; ++_First1, ++_First2)
            _STD iter_swap(_First1, _First2);
        }
    }
于 2013-09-19T06:40:02.113 回答