我在 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);
通常对函数体进行很少的更改,因为 *x
、x[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/