C++ 将静态数组推入std::vector?

C++ 将静态数组推入std::vector?,c++,arrays,vector,C++,Arrays,Vector,我正在努力做到以下几点: 我有: std::vector<std::vector<GLdouble[2]>> ThreadPts(4); 但编译器说: 错误15错误C2440:“正在初始化”:无法从“const GLdouble[2]”转换为“double[2]”C:\Program Files\Microsoft Visual Studio 9.0\VC\include\vector 1211 那我怎么做呢? 我使用VS2008和don;我没有std::array,也

我正在努力做到以下几点:

我有:

std::vector<std::vector<GLdouble[2]>> ThreadPts(4);
但编译器说:

错误15错误C2440:“正在初始化”:无法从“const GLdouble[2]”转换为“double[2]”C:\Program Files\Microsoft Visual Studio 9.0\VC\include\vector 1211

那我怎么做呢? 我使用VS2008和don;我没有std::array,也没有boost


感谢

C样式数组是不可赋值的,因此它不能用作
向量
的值类型

如果使用Visual C++ 2008 SP1,则可以<>代码>包含< /代码>,并使用<代码> STD::Tr1::数组< /代码>p>


即使您不想使用所有Boost,您也应该能够简单地将Boost数组头复制到您的项目中并单独使用它;它不依赖于Boost的许多其他部分,并且它所依赖的那些部分可以很容易地删除。

C样式数组是不可赋值的,因此它不能用作
向量的值类型

如果使用Visual C++ 2008 SP1,则可以<>代码>包含< /代码>,并使用<代码> STD::Tr1::数组< /代码>p> 即使您不想使用所有Boost,您也应该能够简单地将Boost数组头复制到您的项目中并单独使用它;它不依赖于Boost的许多其他部分,它所依赖的部分可以很容易地移除。

您可以使用:

您可以使用:


不要使用包含2个成员的原始数组,而是将其包装在结构中,如点:

struct Point {
   GLDouble[2] coords;

   void setCoordinates(GLDouble x, GLDouble y)
   {
     coords[0] = x;
     coords[1] = y;
   }

   /* consider adding constructor(s) and other methods here,
    * if appropriate
    */
};

std::vector<std::vector<Point>> ThreadPts(4);

while(step--)
{
  fx   += dfx;
  fy   += dfy;
  dfx  += ddfx;
  dfy  += ddfy;
  ddfx += dddfx;
  ddfy += dddfy;

  Point p;
  p.setCoordinates(fx,fy);
  ThreadPts[currentvector].push_back(p);
}
结构点{
GLDouble[2]坐标;
无效设置坐标(GLX双精度,GLY双精度)
{
坐标[0]=x;
coords[1]=y;
}
*考虑在这里添加构造函数和其他方法,
*如果合适的话
*/
};
std::vectorthreadpts(4);
而(步骤--)
{
fx+=dfx;
fy+=dfy;
dfx+=ddfx;
dfy+=ddfy;
ddfx+=dddfx;
ddfy+=dddfy;
p点;
p、 设置坐标(fx,fy);
ThreadPts[currentvector]。向后推(p);
}

它占用的内存量与2元素数组相同,并且比数组更具可读性。

与其使用包含2个成员的原始数组,不如将其封装在结构中,就像点一样:

struct Point {
   GLDouble[2] coords;

   void setCoordinates(GLDouble x, GLDouble y)
   {
     coords[0] = x;
     coords[1] = y;
   }

   /* consider adding constructor(s) and other methods here,
    * if appropriate
    */
};

std::vector<std::vector<Point>> ThreadPts(4);

while(step--)
{
  fx   += dfx;
  fy   += dfy;
  dfx  += ddfx;
  dfy  += ddfy;
  ddfx += dddfx;
  ddfy += dddfy;

  Point p;
  p.setCoordinates(fx,fy);
  ThreadPts[currentvector].push_back(p);
}
结构点{
GLDouble[2]坐标;
无效设置坐标(GLX双精度,GLY双精度)
{
坐标[0]=x;
coords[1]=y;
}
*考虑在这里添加构造函数和其他方法,
*如果合适的话
*/
};
std::vectorthreadpts(4);
而(步骤--)
{
fx+=dfx;
fy+=dfy;
dfx+=ddfx;
dfy+=ddfy;
ddfx+=dddfx;
ddfy+=dddfy;
p点;
p、 设置坐标(fx,fy);
ThreadPts[currentvector]。向后推(p);
}

它占用的内存量与2元素数组相同,并且比数组具有更多可读的语义。

您也可以使用std::pair

std::vector<std::vector<std::pair<GLdouble[2],GLdouble[2]> > >  ThreadPts(4);
std::vector ThreadPts(4);

您也可以使用std::pair

std::vector<std::vector<std::pair<GLdouble[2],GLdouble[2]> > >  ThreadPts(4);
std::vector ThreadPts(4);

同意在某些情况下这可能更具可读性,但是,数组的优点是保证其元素之间没有填充,这在数组必须传递给另一个API(如OpenGL)时非常有用。编辑以反映数组中的包装。同意在某些情况下这可能更具可读性,该数组的优点是保证元素之间不填充,如果数组必须传递到另一个API(如OpenGL),这是有用的。编辑以反映数组中的包封。C++应该考虑咨询C++书籍;如果你还没有一本书,你应该考虑从中获得一本。你应该考虑咨询你的C++书籍;如果你还没有一个,你应该考虑从中得到一个。