如何使用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])
答案 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);
}
}