2011-09-22 4 views
9

Привет, я хочу инициализировать вектор размера 9, элементы которого являются векторами размера, скажем 5. Я хочу инициализировать все элементы нулевым вектором.инициализация вектора вектора <doubles> C++

Правильно ли это?

vector<double> z(5,0); 

vector< vector<double> > diff(9, z); 

ИЛИ есть более короткий способ сделать это?

+1

Это правильный способ создания 2D-вектора. Вы просто немного более подробные. –

+2

Исправлен ли этот размер 9x5? –

+0

Да, я знаю размеры перед рукой. Просто выберите 9 и 5, чтобы быть случайным ints для этого вопроса. – smilingbuddha

ответ

12

Вы могли бы потенциально сделать это в одной строке:

vector<vector<double> > diff(9, vector<double>(5)); 

Вы могли бы также рассмотреть возможность использования boost::multi_array для более эффективного хранения и доступа (это позволяет избежать двойной указатель косвенность).

+1

В качестве альтернативы может быть и вектор из 45 элементов со степенным доступом ... –

+2

'vector (5)' достаточно. 'vector (5, 0)' не требуется, если второй аргумент равен '0'. – Nawaz

4

Довольно уверен, что это будет работать:

vector< vector<double> > diff(9, vector<double>(5,0)); 
5

Вы можете поместить все это в одной строке:

vector<vector<double>> diff(9, vector<double>(5)); 

Это позволяет избежать неиспользованную локальной переменной.

(В предварительно C-11 ++ компиляторов вы должны оставить пространство, > >.)

+0

Остерегайтесь '>>' в вашем синтаксисе. Некоторым компиляторам требуется пространство между этими символами. – riwalk

+3

@ Stargazer712 эти компиляторы больше не совместимы! : P –

+2

@ R.MartinhoFernandes, соответствующие или нет, они существуют :) – riwalk

5

vector< vector<double> > diff(9, std::vector<double>(5, 0));

Однако в конкретном случае, когда размеры известны во время компиляции вам мог использовать массив C:

double diff[9][5] = { { 0 } };

4

Если размеры фиксированы, вы можете пойти с std::array вместо:

std::array<std::array<double,5>,9> diff = {}; 
+1

Это также зависит от величины экстентов. 'std :: array' сохраняет все в локальной области, поэтому, если этот массив слишком велик, вы можете вызвать некоторую ошибку, имя которой ускользает от меня. –

+0

Переполнение стека? –

Смежные вопросы