Pushing a static array into a std::vector?

2019-08-03 09:33发布

问题:

I'm trying to do the following:

I have:

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

then I try to do:

 GLdouble tmp[2];
  while(step--)
  {


   fx   += dfx;
   fy   += dfy;
   dfx  += ddfx;
   dfy  += ddfy;
   ddfx += dddfx;
   ddfy += dddfy;
   tmp[0] = fx;
   tmp[1] = fy;
   ThreadPts[currentvector].push_back(tmp);
  }

But the compiler says:

Error 15 error C2440: 'initializing' : cannot convert from 'const GLdouble [2]' to 'double [2]' C:\Program Files\Microsoft Visual Studio 9.0\VC\include\vector 1211

How could I do this then? I'm using VS 2008 and don;t have std::array, and I don't have boost.

Thanks

回答1:

A C-style array is not assignable, so it cannot be used as the value type of a vector.

If you are using Visual C++ 2008 SP1, you can #include <array> and use std::tr1::array.

Even if you don't want to use all of Boost, you should be able to simply copy the Boost Array header into your project and use it on its own; it doesn't rely on many other parts of Boost, and those on which it does rely can be easily removed.



回答2:

Instead of a raw array of 2 members, wrap it in a struct like a Point:

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);
}

It takes the same amount of memory as a 2-element array, and has more readable semantics than an array.



回答3:

You can use an inserter:

std::copy(tmp, tmp+2, std::back_inserter(ThreadPts[currentvector]));


回答4:

You could also use a std::pair

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