更改数组的2行数据

时间:2013-08-21 10:31:11

标签: c++

如何使用swap更改数组的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 个答案:

答案 0 :(得分:5)

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

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

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

编辑:如果您无法使用C ++ 11功能,std::swap_ranges可能是一个选项:

std::swap_ranges( A[i] , A[i] + 4 , A[j] );

答案 1 :(得分:0)

不要交换只是循环:

for (int p=0; p<4; p++) {
    int t = A[j][p];
    A[j][p] = A[i][p];
    A[i][p] = t;
}

答案 2 :(得分:0)

使用另外数据结构,这将最适合您,我建议指针数组

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

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

答案 3 :(得分:-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);
        }
    }