Подтвердить что ты не робот

Правильный способ работы с вектором массивов

Может ли кто-нибудь сказать, что является правильным способом работы с вектором массивов?

Я объявил вектор массивов (vector<float[4]>), но получил error: conversion from 'int' to non-scalar type 'float [4]' requested при попытке resize его. Что происходит не так?

4b9b3361

Ответ 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);