我正在尝试执行以下操作:
我有:
std::vector<std::vector<GLdouble[2]>> ThreadPts(4);
然后我尝试做:
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);
}
但是编译器说:
错误15错误C2440:'初始化':无法从'const GLdouble [2]'转换为'double [2]'C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ vector 1211
那我怎么能这样做? 我正在使用VS 2008而且没有std :: array,我没有提升。
由于
答案 0 :(得分:2)
C样式数组不可分配,因此不能用作vector
的值类型。
如果您使用的是Visual C ++ 2008 SP1,则可以#include <array>
并使用std::tr1::array
。
即使您不想使用所有Boost,您也应该只需将Boost Array标头复制到项目中并自行使用它;它不依赖于Boost的许多其他部分,而且它依赖的部分可以很容易地被删除。
答案 1 :(得分:2)
而不是包含2个成员的原始数组,将其包装在像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);
}
它占用与2元素数组相同的内存量,并且具有比数组更可读的语义。
答案 2 :(得分:0)
您可以使用inserter
:
std::copy(tmp, tmp+2, std::back_inserter(ThreadPts[currentvector]));
答案 3 :(得分:0)
你也可以使用std :: pair
std::vector<std::vector<std::pair<GLdouble[2],GLdouble[2]> > > ThreadPts(4);