Вставить статический массив в std :: vector? - PullRequest
1 голос
/ 07 июля 2010

Я пытаюсь сделать следующее:

У меня есть:

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, и у меня нет boost.

Спасибо

Ответы [ 4 ]

2 голосов
/ 07 июля 2010

Вместо необработанного массива из 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 голосов
/ 07 июля 2010

Массив в стиле C нельзя назначить, поэтому его нельзя использовать в качестве типа значения для vector.

Если вы используете Visual C ++ 2008 SP1, вы можете #include <array> и использовать std::tr1::array.

Даже если вы не хотите использовать все Boost, вы можете просто скопировать заголовок Boost Array в ваш проект и использовать его самостоятельно; он не зависит от многих других компонентов Boost, и те, на которые он опирается, могут быть легко удалены.

0 голосов
/ 07 июля 2010

Вы также можете использовать std :: pair

std::vector<std::vector<std::pair<GLdouble[2],GLdouble[2]> > >  ThreadPts(4);
0 голосов
/ 07 июля 2010

Вы можете использовать inserter:

std::copy(tmp, tmp+2, std::back_inserter(ThreadPts[currentvector]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...