【发布时间】:2012-10-20 22:53:42
【问题描述】:
对于这个数组:
vector<vector<int> > v;
v.push_back(vector<int>(0));
v.back().push_back(1);
v.back().push_back(2);
v.back().push_back(3);
v.back().push_back(4);
我可以很容易地输出 {1, 2, 3, 4}:
cout << v[0][0] << endl;
cout << v[0][1] << endl;
cout << v[0][2] << endl;
cout << v[0][3] << endl;
要以平面数组的形式访问它,我可以这样做:
int* z = (int*)&v[0].front();
cout << z[0] << endl;
cout << z[1] << endl;
cout << z[2] << endl;
cout << z[3] << endl;
现在,如何将多维向量作为平面多维数组访问?我不能使用与访问一维向量相同的格式:
// This does not work (outputs garbage)
int** n = (int**)&v.front();
cout << n[0][0] << endl;
cout << n[0][1] << endl;
cout << n[0][2] << endl;
cout << n[0][3] << endl;
我发现的解决方法是这样做:
int** n = new int* [v.size()];
for (size_t i = 0; i < v.size(); i++) {
n[i] = &v.at(i).front();
}
cout << n[0][0] << endl;
cout << n[0][1] << endl;
cout << n[0][2] << endl;
cout << n[0][3] << endl;
有没有办法像平面 c 样式数组一样访问整个多维向量,而不必在访问数据之前动态分配数据上方的每个维度?
速度在实施中并不重要,维护的清晰性至关重要。多维向量非常适合存储数据。但是,我还想在 SDK 中将数据公开为平面 c 样式数组,以便其他语言可以轻松访问它。这意味着将向量公开为 STL 对象是不行的。
我提出的解决方案可以很好地满足我的需求,因为我只在处理结束时评估一次数组以“展平”它。但是,有没有更好的方法来解决这个问题?或者我是否已经在不重新实现我自己的数据结构的情况下尽我所能做到最好(矫枉过正,因为我的扁平化代码只有几行)。
感谢您的建议,朋友们!
【问题讨论】:
-
你知道第二个尺寸吗,我的意思是所有
vector<int>元素的尺寸都应该一样吗?
标签: c++ vector std multidimensional-array flat