我有一个小程序可以计算行星之间的作用力。我的程序有两个结构数组,一个保存迭代前的位置和速度,另一个保存迭代后它们的位置和速度。
在每次迭代结束时,我想将值从第二个数组移动到第一个数组,第二个数组可能会变成垃圾(但需要指向一些我可以稍后写入的有效内存位置)。我以为我可以简单地切换数组,因为数组是一个指针,但编译器不允许我这样做。
考虑这个例子:
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]
}
这就是我想做的。它肯定比从 1 到 N 的 for 循环更快。
最佳答案
你应该考虑使用可以在常数时间内交换的std::vector
:
std::vector<Foo> bar(8), baz(8);
std::swap(bar, baz);
或者,如果您不想那样做,而是想手动管理您的内存,您可以使用 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
// ...
关于c++ - 是否可以交换结构数组(线性时间)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9242984/