不匹配'运营商='为3d矢量

时间:2015-10-11 16:26:47

标签: c++ multidimensional-array vector

我正在尝试将坐标std :: vector surface的矢量转换为3D数组,将surface中包含的3d数组的所有条目设置为0; 但是我得到了运营商阵列的不匹配。 我多次查看错误,但没找到我的情况......

std::vector<coordinates>表面是全局的。 coordiantes看起来像

struct coords{
    int xvalue;
    int yvalue;
    int zvalue;

    coords(int x1, int y1, int z1) : xvalue(x1),yvalue(y1),zvalue(z1){}
    ~coords(){}
};
typedef struct coords coordinates;

我的方法是:

(doubleBox是3D双向量的typedef)

doubleBox levelset::putIntoBox( vector<coordinates> surface){
    int xMaxs, yMaxs,zMaxs;
    for (vector<coordinates>::iterator it = surface.begin() ; it != surface.end(); ++it){
        if (it->xvalue > xMaxs)
            xMaxs = it->xvalue;
        if (it->yvalue > yMaxs)
            yMaxs = it->yvalue;
        if (it->zvalue > zMaxs)
            zMaxs = it->zvalue;
        //check invalid surface
        if (it->xvalue < 0 || it->yvalue <0 || it->zvalue<0)
            cout << "invalid surface with point coordinates below 0 !" << endl;
    }
    doubleBox surfaceBox[xMaxs+1][yMaxs+1][zMaxs+1];

    int max = std::ceil(sqrt(xMaxs*xMaxs + yMaxs*yMaxs + zMaxs*zMaxs));
    std::fill(&surfaceBox[0][0][0],&surfaceBox[0][0][0] + sizeof(surfaceBox)*sizeof(surfaceBox[0])/ sizeof(surfaceBox[0][0]) / sizeof(surfaceBox[0][0]), max);

    for (vector<coordinates>::iterator it = surface.begin() ; it != surface.end(); it++){
        surfaceBox[it->xvalue][it->yvalue][it->zvalue] = 0.0;
    }

    return surfaceBox;
}

输出是(声明错误位于第二个for循环中)

c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\vector.tcc:160:5: note: std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(const std::vector<_Tp, _Alloc>&) [with _Tp = std::vector<std::vector<double> >; _Alloc = std::allocator<std::vector<std::vector<double> > >]
     vector<_Tp, _Alloc>::
     ^
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\vector.tcc:160:5: note:   no known conversion for argument 1 from 'const int' to 'const std::vector<std::vector<std::vector<double> > >&'
..\src\Levelset.cpp: In member function 'doubleBox levelset::putIntoBox(std::vector<coords>)':
..\src\Levelset.cpp:295:1: warning: control reaches end of non-void function [-Wreturn-type]

也许这个问题是由std :: fill使用不当造成的?

1 个答案:

答案 0 :(得分:1)

由于doubleBox被定义为std::vector<std::vector<std::vector<double>,为什么要以这种方式定义doubleBox surfaceBox[xMaxs+1][yMaxs+1][zMaxs+1];

您定义的是一个三维数组,其元素类型为doubleBox,这意味着每个元素都是std::vector<std::vector<std::vector<double>类型,这不是您想要的。

您可能需要doubleBox surfaceBox(xMaxs + 1, std::vector<std::vector<double>>(yMaxs + 1, std::vector<double>(zMaxs + 1)));

之类的内容