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
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.
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.
You can use an inserter
:
std::copy(tmp, tmp+2, std::back_inserter(ThreadPts[currentvector]));
You could also use a std::pair
std::vector<std::vector<std::pair<GLdouble[2],GLdouble[2]> > > ThreadPts(4);