Правильный способ работы с вектором массивов - PullRequest
53 голосов
/ 06 января 2011

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

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

Ответы [ 4 ]

110 голосов
/ 06 января 2011

Вы не можете хранить массивы в vector или любом другом контейнере. Тип элементов, которые должны храниться в контейнере (называемый типом значения контейнера ), должен быть как копируемым, так и назначаемым. Массивы тоже нет.

Однако вы можете использовать шаблон класса array, например, предоставляемый Boost, TR1 и C ++ 0x:

std::vector<std::array<double, 4> >

(Вы можете заменить std::array на std::tr1::array, чтобы использовать шаблон, включенный в C ++ TR1, или boost::array, чтобы использовать шаблон из библиотек Boost . В качестве альтернативы вы можете написать ваш собственный, это довольно просто.)

8 голосов
/ 06 октября 2014

Нет ошибки в следующем фрагменте кода:

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]);

ВЫХОД IS:

6,28

2,5

9,73

4,364

В заключение:

std::vector<double*>

- это еще одна возможность, кроме

std::vector<std::array<double, 4>>

что предложил Джеймс МакНеллис.

8 голосов
/ 06 января 2011

Использование:

vector<vector<float>> vecArray; //both dimensions are open!
5 голосов
/ 06 января 2011

Каждый элемент вашего вектора имеет значение float[4], поэтому при изменении размера каждый элемент должен по умолчанию инициализироваться из float[4].Я так понимаю, вы пытались инициализировать значением int, таким как 0?

Попробуйте:

static float zeros[4] = {0.0, 0.0, 0.0, 0.0};
myvector.resize(newsize, zeros);
...