【问题标题】:C++ vector<vector<double> > to double **C++ 向量<vector<double> > 加倍 **
【发布时间】:2011-06-14 03:40:44
【问题描述】:

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

【问题讨论】:

    标签: c++ pointers vector


    【解决方案1】:

    vector&lt;vector&lt;double&gt;&gt;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_stepcol_step 是布局相关的偏移量。标准库并没有真正为这些数据结构提供任何帮助。但是您可以尝试使用 Boost 的 multi_array 或 GS​​L 的 multi_span 来帮助解决这个问题。

    【讨论】:

    • 你能更新这个吗?或者介意我用一个调用data而不是获取第一个元素的地址的版本来更新这个?
    • 太棒了。谢谢。
    • 这是最好的答案,我正在编写一些 2021 年需要它的代码。很高兴地说这行得通。
    【解决方案2】:

    在我看来,您需要将vector&lt;vector&lt;double&gt; &gt; 转换为正确的数据类型,在此过程中将所有值复制到嵌套数组中

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

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

    【讨论】:

      【解决方案3】:

      Vector> 与指向 m 的双精度指针几乎不一样。从外观上看,m 被假定为一个二维数组,而向量可以被存储为锯齿状,并且在内存中不一定是相邻的。如果你想传入它,你需要将向量值复制到一个临时 2dim 双精度数组中,而不是传入该值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-25
        • 1970-01-01
        相关资源
        最近更新 更多