Правильный способ работы с вектором массивов
Может ли кто-нибудь сказать, что является правильным способом работы с вектором массивов?
Я объявил вектор массивов (vector<float[4]>
), но получил error: conversion from 'int' to non-scalar type 'float [4]' requested
при попытке resize
его. Что происходит не так?
Ответы
Ответ 1
Вы не можете хранить массивы в vector
или любом другом контейнере. Тип элементов, которые должны храниться в контейнере (называемый типом значения контейнера), должен быть как конструктивным, так и назначаемым. Массивы также не являются.
Однако вы можете использовать шаблон класса array
, такой как тот, который предоставляется Boost, TR1 и С++ 0x:
std::vector<std::array<double, 4> >
(Вы хотите заменить std::array
на std::tr1::array
, чтобы использовать шаблон, включенный в С++ TR1, или boost::array
, чтобы использовать шаблон из библиотеки Boost. В качестве альтернативы вы можете написать свой собственный, это довольно просто.)
Ответ 2
Использование:
vector<vector<float>> vecArray; //both dimensions are open!
Ответ 3
В следующем фрагменте кода нет ошибки:
float arr[4];
arr[0] = 6.28;
arr[1] = 2.50;
arr[2] = 9.73;
arr[3] = 4.364;
std::vector<float*> vec = std::vector<float*>();
vec.push_back(arr);
float* ptr = vec.front();
for (int i = 0; i < 3; i++)
printf("%g\n", ptr[i]);
ВЫХОД:
6,28
2,5
9,73
4,364
В ЗАКЛЮЧЕНИИ:
std::vector<double*>
- еще одна возможность, кроме
std::vector<std::array<double, 4>>
который предложил Джеймс Макнеллис.
Ответ 4
Каждый элемент вашего вектора - это float[4]
, поэтому при изменении размера каждый элемент должен быть инициализирован по умолчанию из float[4]
. Полагаю, вы пытались инициализировать значение int
, подобное 0
?
Try:
static float zeros[4] = {0.0, 0.0, 0.0, 0.0};
myvector.resize(newsize, zeros);