2016-02-15 3 views
1

hi Я должен создать динамический двумерный вектор. Будучи двумерным, я думаю, что лучше не использовать boost.MultiArray для эффективных календаря (накладные расходы для вектора ручки с более чем 2-мя измерениями). Моя структура данных должна изменять размер строки во время выполнения, а размер столбцов фиксирован, т. Е. Равен двум.Лучшее решение для изменяемого размера и динамического двумерного массива

Я думал, что-то вроде этого:

vector<vector<unsigned int> > grid;//declaration 
vector<unsigned int> row(2); 
grid.push_back(row);//copy vector row and insert in grid 

Мои вопросы: это хороший способ сделать свое намерение? Я думаю, что это неэффективно, дорого. Что происходит, когда я вызываю push_back? Или есть лучший способ, который я игнорирую? И еще, есть ли возможность указать в декларации, что внутренний вектор имеет размер два? (компилятор C++ 11)

+0

Я думаю, что это зависит от вашего ввода. Фактически вы можете рассматривать его как двумерный массив регулятора. Итак, сетка [0] .push_back (1); может работать тоже. – AchmadJP

+0

Если размер исправлен, используйте 'std :: array'. –

+0

#AchmadJP, но когда размер преодолевает мощность, что происходит? Я думаю, что-то дорого. Могу ли я избежать или ограничить это? – Umbert

ответ

0

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

Все, что вам нужно, это простой тип данных, такой как std::array, std::pair, или std::tuple. , например.

std::vector< std::array< int, 2 > > grid; 
grid.push_back({ 5, 3 }); 

Что касается изменения размера вектора, который всегда будет. Но стоимость амортизируется линейным временем (т. Е. Периодически требуется перераспределять и копировать, но это происходит экспоненциально реже, поскольку размер увеличивается экспоненциально).

Если вы на самом деле знаете, сколько элементов вам может понадобиться, вы можете избежать ненужного изменения размера спереди, используя std::vector::reserve.

+0

Спасибо. Я пробовал так, что кажется самым простым: vector grid; unsigned int a [2]; a [0] = 0; a [1] = 1; grid.push_back (a); но не компилировать – Umbert

+0

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

+0

Тогда ваш лучший выбор - 'std :: pair' или определить вашу собственную структуру. – paddy

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