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

标签 c++ pointers struct

我有一个小程序可以计算行星之间的作用力。我的程序有两个结构数组,一个保存迭代前的位置和速度,另一个保存迭代后它们的位置和速度。

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

考虑这个例子:

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/

相关文章:

c++ - 字符数组地址和整型数组地址

c - 如何在不更改 C 中原始数组的情况下对指针数组进行排序

c++ - 定义结构

c++ - QTcpSocket 写入数据结构

c++ - 如何防止或关闭位图的 direct2d "autoscaling"?

c++ - 在不带 BOM 编码的 UCS-2 LE 中使用标准 ofstream 编写 C++ 文件

c - 为数组动态分配内存时(在 C 中),(int *) 强制转换的作用是什么?

c++ - 为什么 n*n 在循环的第一个瞬间结果为 4?对我来说应该是 1*1。相反,它是 2*2

c - 如何在 Main() 之前创建数组/结构并在 C 中对其进行初始化

c++ - 在派生类中使用基类 Copy CTOR