@ dreamlax, верно, ты. Служит мне правильно, если я отвечаю поздно вечером и не тестирую примеры кода. Исправлена. Большое спасибо!

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

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

 James McNellis06 янв. 2011 г., 07:53
@Domenic: Это одна из радостей C ++, когда вы начинаете искать такие вещи, как «std list» и «c string», и понимаете, что вы сделали, только после того, как нажали кнопку «search».
 AraK06 янв. 2011 г., 07:17
Вы не можете иметь вектор собственных массивов, потому что они не могут быть ни назначаемыми, ни копируемыми.
 ACK_stoverflow15 дек. 2011 г., 21:13
@ Domenic: дополнительные баллы за правильную пунктуацию при построении предложения, которое для большинства было бы слишком много.

Ответы на вопрос(4)

Решение Вопроса

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

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

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

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

 AraK06 янв. 2011 г., 07:21
+1 за предложениеstd::array, ;)
 T.C.12 янв. 2016 г., 04:22
Второе предложение больше не верно в C ++ 11, но остальное все еще верно. Проблема в C ++ 11 состоит в том, что массивы неErasableпо крайней мере с распределителем по умолчанию.
 JohnKoch18 мар. 2018 г., 11:45
Требования к контейнерам STL (публикация C ++ 11) смотрите в этой теме:Msgstr "Изменил ли C ++ 11 требования к элементам контейнеров STL и как?"

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

vector<vector<float>> vecArray; //both dimensions are open!
 nbubis03 мар. 2015 г., 02:42
@ Влад, в с ++ 11 это совершенно законно ..
 Vlad25 апр. 2013 г., 00:53
Использовать: vector <vector <float>>
 johnbakers14 мая 2013 г., 12:36
вектор вектора не является смежным, если это требуется OP.

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

Пытаться:

static float zeros[4] = {0.0, 0.0, 0.0, 0.0};
myvector.resize(newsize, zeros);
 dreamlax06 янв. 2011 г., 07:18
Я думаю твой[4] находится не в том месте. Также объекты со статическим хранилищем автоматически инициализируются нулями.
 dreamlax06 янв. 2011 г., 07:20
Ах! Исправлено, +1! :)
 Mark Ransom06 янв. 2011 г., 07:20
@ dreamlax, верно, ты. Служит мне правильно, если я отвечаю поздно вечером и не тестирую примеры кода. Исправлена. Большое спасибо!

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

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>>

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

 user352843826 мар. 2015 г., 19:55
это только сделало вектор не копируемым.
 Ruslan Yushchenko01 дек. 2014 г., 12:07
В вашем примере arr опасно приводится к указателю. Если arr выходит из области видимости, в то время как vec все еще существует, произойдет неопределенное поведение (вероятное переполнение стека).

Ваш ответ на вопрос