2013-06-08 1 views
3

Я изучал всюду в книгах о Dymanic массивах. Я использовал их в STL на C++. Но я до сих пор не понимаю, что такое динамические массивы. Как выполняются операции над динамическими массивами.Как выполняются операции для динамического массива?

+0

читать: http://www.cplusplus.com/reference/vector/vector/ –

ответ

1

В C++ есть (ну, очень скоро будет!) 4 вида массивов: C-стиль статические массивы, 11 static arrays C++, C++ dynamic vectors и C++ 14 dynamic arrays.

Статические массивы C-стиля и C++ 11 принимают параметр постоянной величины времени компиляции и не могут быть увеличены/сжаты после их инициализации. Динамические векторы C++ могут принимать любое количество элементов времени выполнения при инициализации и впоследствии могут быть увеличены/уменьшены. С предстоящим стандартом C++ 14 также будет std::dynarray, который заполняет промежуток между существующими контейнерами: во время инициализации он будет принимать количество элементов во время выполнения, но впоследствии не может быть увеличено/сокращено.

Вот некоторые основные случаи использования:

static const int N = 4;    // compile-time constant int 
int M = 4;        // run-time int 

int c[N] = { 0, 1, 2, 3 };    // C-style static array: compile-time constant size 
std::array<int, N> a = { 0, 1, 2, 3 }; // C++11 static array: compile-time constant size 

int rc[M] = { 0, 1, 2, 3 };    // ERROR: M is not a compile-time constant expression 
std::array<int, M> ra = { 0, 1, 2, 3 }; // ERROR: M is not a compile-time constant expression 

std::vector<int> v { std::begin(a), std::end(a) }; // C++ dynamic vector: runtime size, but can be enlarged afterwards 
v.push_back(4);          // v enlarged to { 0, 1, 2, 3, 4 } now 
v.pop_back();          // v shrunk back to { 0, 1, 2, 3 } 

std::dynarray<int> d { std::begin(v), std::end(v) }; // C++14 dynamic array: runtime size, but cannot be enlarged afterwards 

Статических массивы (массивы C-типа, std::array) статическое распределение памяти в стеке. Динамические массивы (std::vector<T> и std::dynarray<T>) могут принимать параметр шаблона Allocator. Для std::vector этот Allocator по умолчанию имеет значение std::allocator<T>, что делает динамическое управление памятью низкого уровня за кулисами, используя new. Для память выделяется из неуказанного источника, который может или не может вызвать глобальный operator new.

Поставляя пользовательский распределитель, можно использовать как std::vector, так и std::dynarray для работы с распределением памяти на основе стека, например. используя @HowardHinnant's stack allocator.

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