C ++ vector <vector <double>&gt;加倍** </vector <double>

时间:2011-01-23 20:05:49

标签: c++ pointers vector

我正在尝试将vector<vector<double> >类型的变量传递给函数F(double ** mat, int m, int n)。 F函数来自另一个lib,所以我无法更改它。有人可以给我一些暗示吗?感谢。

3 个答案:

答案 0 :(得分:15)

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保证所有元素都连续存储在内存中。

如果可能,请考虑更改功能的签名。通常,矩阵在内存中线性排列。这意味着,访问矩阵元素可以使用类型p的一些基本指针double*来实现左上角系数,一些基于行和列的计算线性索引,例如p[row*row_step+col*col_step]其中{{} 1}}和row_step是与布局相关的偏移量。标准库并没有真正为这些类型的数据结构提供任何帮助。但是你可以尝试使用Boost的col_step或GSL的multi_array来帮助解决这个问题。

答案 1 :(得分:1)

我看到它的方式,您需要将vector<vector<double> >转换为正确的数据类型,在过程中将所有值复制到嵌套数组

矢量的组织方式与数组完全不同,因此即使您可以强制数据类型匹配,它仍然无效。

不幸的是,我的C ++经验存在于几年前,所以我不能在这里给你一个具体的例子。

答案 2 :(得分:1)

矢量&lt;矢量&lt;双&GT; &GT;与m的双指针几乎不一样。从它的外观来看,m被假定为二维阵列,而矢量可以被存储为锯齿状并且不一定在存储器中相邻。如果要传入它,则需要将矢量值复制到temp 2dim double数组中,而不是传递该值。