jmasterx
jmasterx

Reputation: 54113

Pushing a static array into a std::vector?

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

Upvotes: 3

Views: 4790

Answers (4)

James McNellis
James McNellis

Reputation: 355049

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

If you are using at least C++11, you can #include <array> and use std::array. (Historically available in Visual C++ 2008 SP1 as std::tr1::array).

typedef std::vector<GLdouble[2]> pointList;
// Becomes
typedef std::vector<std::array<GLdouble, 2>> pointList;

https://en.cppreference.com/w/cpp/container/array

If you don't have that, you may 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.

Upvotes: 3

Falmarri
Falmarri

Reputation: 48567

You could also use a std::pair

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

Upvotes: 0

Jason S
Jason S

Reputation: 189656

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.

Upvotes: 2

Stephen
Stephen

Reputation: 49156

You can use an inserter:

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

Upvotes: 0

Related Questions