2010-07-07 54 views
1

我试图做到以下几点:将静态数组推入std :: vector?

我:

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

你应该考虑咨询您的C++的书;如果你还没有一个,你应该考虑从[The Definitive C++ Book Guide and List]中获取一个(http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list )。 – 2010-07-07 03:00:50

回答

2

A C样式数组不可分配,因此它不能被用作vector的值类型。

如果您使用的是Visual C++ 2008 SP1,则可以使用#include <array>并使用std::tr1::array

即使你不想使用所有的Boost,你也应该能够简单地将Boost Array头复制到你的项目中并单独使用它;它不依赖于Boost的许多其他部分,并且它所依赖的部分可以轻松移除。

+0

好吧,我会使用std :: tr1 ::数组谢谢 – jmasterx 2010-07-07 02:43:30

0

可以使用一个inserter

std::copy(tmp, tmp+2, std::back_inserter(ThreadPts[currentvector])); 
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); 
} 

它需要的内存量相同一个2元素的数组,并且具有比数组更可读的语义。

+0

OpenGL不会喜欢这个.... – jmasterx 2010-07-07 02:50:09

+0

一致认为,这可能在某些情况下更具可读性,但是,该数组的优点是保证其之间没有填充元素,如果数组必须传递给另一个API(如OpenGL),这非常有用。 – 2010-07-07 02:50:27

+0

编辑以反映数组中的包装。 – 2010-07-07 02:51:30

0

你也可以使用一个std ::对

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