是否可以交换结构数组(线性时间)?

ete*_*att 1 c++ struct pointers

我有一个小程序来计算彼此的行星的力量.我的程序有两个结构数组,一个在迭代前保持位置和速度,另一个保持迭代后它们的位置和速度.

在每次迭代结束时,我想将第二个数组中的值移动到第一个数组中,第二个数组可能变为垃圾(但需要指向我稍后可以写入的一些有效内存位置).我以为我可以简单地切换数组,因为数组是指针,但编译器不会让我.

考虑这个例子:

typedef struct { int a; } Foo;

int main()
{
   Foo bar[8], baz[8];

   Foo *temp = baz;
   baz = bar;   //ISO C++ forbids the assignment of arrays
   bar = temp;  //incompatible types in assignment of Foo* to Foo[8]
}
Run Code Online (Sandbox Code Playgroud)

这就是我想做的.它肯定比从1到N的for循环更快.

Set*_*gie 5

您应该考虑使用std::vector哪些可以在恒定时间内交换:

std::vector<Foo> bar(8), baz(8);

std::swap(bar, baz);
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想这样做而是想手动管理内存,则可以使用new[]获取指向免费存储上的数组的指针,并在需要交换数组时交换指针.

如果必须在堆栈上放置数组,那么在没有实际交换每个元素的情况下执行此操作的唯一方法是在堆栈上创建数组,而不是使用数组,使用指向数组的指针:

Foo bar[8], baz[8], *pbar = bar, *pbaz = baz;

// ...
// this code only using pbar and pbaz
// ...

// swap the pointers
std::swap(pbar, pbaz);

// ...
// use pbar and pbaz some more
// ...
Run Code Online (Sandbox Code Playgroud)