【发布时间】:2011-06-14 03:40:44
【问题描述】:
我正在尝试将vector<vector<double> > 类型的变量传递给函数F(double ** mat, int m, int n)。 F 函数来自另一个库,所以我无法更改它。有人可以给我一些提示吗?谢谢。
【问题讨论】:
我正在尝试将vector<vector<double> > 类型的变量传递给函数F(double ** mat, int m, int n)。 F 函数来自另一个库,所以我无法更改它。有人可以给我一些提示吗?谢谢。
【问题讨论】:
vector<vector<double>> 和 double** 是完全不同的类型。但是可以借助另一个存储一些双指针的向量来提供此函数:
#include <vector>
void your_function(double** mat, int m, int n) {}
int main() {
std::vector<std::vector<double>> thing = ...;
std::vector<double*> ptrs;
for (auto& vec : thing) {
// ^ very important to avoid `vec` being
// a temporary copy of a `thing` element.
ptrs.push_back(vec.data());
}
your_function(ptrs.data(), thing.size(), thing[0].size());
}
之所以可行,其中一个原因是std::vector 保证所有元素都连续存储在内存中。
如果可能,请考虑更改函数的签名。通常,矩阵在内存中呈线性布局。这意味着,访问矩阵元素可以使用一些double* 类型的基指针p 来完成左上系数和一些基于行和列的计算线性索引,如p[row*row_step+col*col_step] 其中row_step 和col_step 是布局相关的偏移量。标准库并没有真正为这些数据结构提供任何帮助。但是您可以尝试使用 Boost 的 multi_array 或 GSL 的 multi_span 来帮助解决这个问题。
【讨论】:
data而不是获取第一个元素的地址的版本来更新这个?
在我看来,您需要将vector<vector<double> > 转换为正确的数据类型,在此过程中将所有值复制到嵌套数组中
向量的组织方式与数组完全不同,因此即使您可以强制数据类型匹配,它仍然不起作用。
不幸的是,我的 C++ 经验是几年前的事了,所以我不能在这里给你一个具体的例子。
【讨论】:
Vector
【讨论】: