如何将向量向量传递给期望指向(原始)指针的函数

时间:2015-03-25 17:13:53

标签: c++ pointers c++11 vector

我有一个接受指向double的指针的函数:

void Foo(double ** m);  // expects a 3x3 matrix of doubles

是否有可能,通过适当的转换和诸如此类的方法,将std :: vector的std :: vector传递给double或者std :: array of std :: arrays of double?如果是这样,有人可以解释一下吗?

std::vector<std::vector<double>> v(3, std::vector<double>(3));
std::array<std::array<double, 3>, 3> a;

如果函数只接受指向double的指针,那么这是可能的。 (通过v.data()或a.data())。但是函数接口中指向指针的指针让我觉得这种转换可能是不可能的。

谢谢,

亚伦

6 个答案:

答案 0 :(得分:7)

您必须通过示例构建数组:

double* a[3] = {v[0].data(), v[1].data(), v[2].data()};
Foo(a);

答案 1 :(得分:3)

您无法 double**未指向二维数据。它指向一个指向其他数组的指针数组。即使您可以找到编译的强制转换,数据布局也只是不兼容。

答案 2 :(得分:2)

尝试以下

double **p = new double *[v.size()];

for ( size_t i = 0; i < v.size(); i++ ) p[i] = v[i].data();

Foo( p );

delete [] p;

这是一个示范程序

#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>


int main()
{
    std::vector<std::vector<double>> v =
    {
        { 1.1, 2.2, 3.3 },
        { 4.4, 5.5, 6.6 },
        { 7.7, 8.8, 9.9 }
    };

    double **p = new double *[v.size()];

    double * ( std::vector<double>::*fn )() noexcept = &std::vector<double>::data;

    std::transform( v.begin(), v.end(), p, std::mem_fn( fn ) );

    for ( size_t i = 0; i < v.size(); i++ )
    {
        for ( size_t j = 0; j < v.size(); j++ ) std::cout << p[i][j] << ' ';
        std::cout << std::endl;
    }

    delete [] p;
}

输出

1.1 2.2 3.3 
4.4 5.5 6.6 
7.7 8.8 9.9 

答案 3 :(得分:0)

如果它只是一个不匹配的函数,并且它没有在某个内部循环中调用,(并且你不能改变它的签名,就像它的一部分你无法改变的那样):唯一的解决方案我能想到的是取消你的矢量。迭代你的向量并拉出所有数据并将其放入一个数组然后将其提供给你的函数。

显然,这在几个方面都很讨厌,所以如果你有另一个选择(特别是重载函数接受vector,那么这可能是一个更好的选择。

答案 4 :(得分:0)

我认为存在设计问题。你确定void Foo(double ** m);期望3x3的双倍矩阵吗?如果是,则需要一些包装函数将vector<vector<double> >转换为double**。无论如何,这是错误的做法。

答案 5 :(得分:0)

template<class T>
std::vector<T*> make_jagged_array( std::vector<std::vector<T>>& vec ) {
  std::vector<T*> retval;
  retval.reserve(vec.size());
  for(auto&& v:vec)
    retval.push_back(v.data());
  return retval;
}

会将vector<vector<X>>转换为vector<X*>vector<X*>.data()会将您X**的所有内容转换为您。

为n维做这件事会很有趣。