2015-05-29 2 views
3

Недавно у меня была возможность использовать vector<vector<vector<Some_Struct>>> threeFoldVec, Нам пришлось нажать это на list. Размер threeFoldVec известен во время инициализации.Определить размер вектора вектора вектора на момент объявления

Мне известно, как определить размер вектора 2_fold во время объявления.

std::vector<std::vector<SomeStruct>> Layer_1(10, std::vector<SomeStruct>(5)); 

Но когда дело доходит до вектора 3_fold, я в замешательстве.

std::vector<std::vector<std::vector<SomeStruct>>> 
         Layer_1(10, std::vector<std::vector<SomeStruct>>(10)); 

Таким образом, я могу перейти к второму измерению. Я могу, очевидно, пройти через Layer_1 и использовать resize или reserve по мере необходимости, я заинтересован в том, чтобы делать это на месте, просто потому, что я думаю, что это сложно-круто.

+0

Я тоже смущен. Является ли «SingleNeuron» таким же, как «SomeStruct»? – Beta

+0

@Beta Надеюсь, это просто опечатка, так как иначе это невозможно будет объявить, так как типы не совпадают. – vsoftco

+0

да .. это была опечатка .. теперь исправлено – user2705939

ответ

3

Вы можете сделать это:

std::vector<std::vector<std::vector<SomeStruct>>> 
    Layer_1(10, std::vector<std::vector<SomeStruct>>(20, std::vector<SomeStruct>(30))); 

Это создаст 10 x 20 x 30 многомерный массив. Обратите внимание, что крайне неэффективно использовать вложенные векторы, гораздо лучше использовать 1D плоского вектор и использовать схему адресации 3D, т.е. для массива размера HEIGHT x ROWS x COLS, вы адресуете логический элемент [i][j][k] в

[i][j][k] -> i * ROWS * COLS + j * COLS + k 

Это гарантирует, что ваши объекты хранятся смежно, поэтому ваше время доступа будет лучше.

+0

thx .. получил .. определенно попробует 1D векторную альтернативу. Если это будет сделано, я опубликую результаты обеих реализаций – user2705939

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