c++ - 替代数组表示

标签 c++ arrays

我在 C++ 中遇到了一个问题,目前我还没有完美的解决方案。我正在接收以下格式的数据:

typedef struct {
  int x;
  int y;
  int z;
}Data3D;

vector<Data3D> v; // the way data is received (can be modified)

但是进行计算的函数接收这样的参数:

Compute(int *x, int *y, int *z, unsigned nPoints)
{...}

有没有一种方法可以修改 Data3D 接收数据的方式,以便内存表示从以下位置更改:

XYZXYZXYZ

XXXYYYZZZ

我正在寻找的是某种填充数据结构的方法,其方式与我们填充数组的方式类似,但具有上述表示形式 (XXXYYYZZZ)。欢迎使用任何自定义数据结构。

所以我想写一些类似的东西(在上面的例子中):

v[0].x = 1
v[0].y = 2
v[0].y = 0

v[1].x = 6
v[1].y = 7
v[1].z = 5

并具有下面的内存表示

1,6...2,7....0,5

1,6 is the beginning of the x array

2,7 is the beginning of the y array

0,5 is the beginning of the z array

我知道这可以通过使用临时数组来解决,但我很想知道是否有其他方法可以做到这一点。

谢谢,

尤利安

后期编辑:

由于有些解决方案仅更改Compute 函数的声明而不更改其代码 - 这也应考虑在内。请参阅与涉及使用迭代器的解决方案相关的答案。

最佳答案

基于迭代器的解决方案

一个优雅的解决方案是让 Compute() 接受迭代器而不是指针。您提供的迭代器将具有足够的++ 运算符(有关构建它们的简单方法,请参见 boost::iterator)

Compute(MyIterator x, MyIterator y, MyIterator z);

通常对函数体进行很少的更改,因为 *xx[i]++x 将由 MyIterator 处理以指向正确的内存位置。

Quick'n Dirty 解决方案

一个不太优雅但更直接的解决方案是将您的数据保存在以下结构中

typedef struct {
  std::vector<int> x;
  std::vector<int> y;
  std::vector<int> z;
}DataArray3D;

当收到数据时填写你的结构

void Receive(const Data3D& data, DataArray3D& array)
{
  array.x.push_back(data.x);
  array.y.push_back(data.y);
  array.z.push_back(data.z);
}

然后像这样调用Compute(Compute本身是不变的)

Compute(&array.x[0], &array.y[0], &array.z[0]);

关于c++ - 替代数组表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5497100/

相关文章:

c++ - 我应该如何在 C++ 中表示继承对象树?

javascript - 如何让按钮更改 Javascript 数组位置?

c++ - 在 cmake 中使用 boost::json 静态库

c++ - openssl api禁用身份验证

javascript - 对 html 中选定的值求和

c# - 对象数组到字节数组

Javascript 检查数组中至少 2 个字符串非空

c++ - C++ 中的编译时常量

.net - 手机连接电脑

c++ - c++ 枚举的底层类型是什么?