Как выполняются операции для динамического массива?

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

3

Решение

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

Статические массивы в стиле C и C ++ 11 принимают параметр постоянного размера во время компиляции и не могут быть увеличены / сокращены после их инициализации. Динамические векторы C ++ могут принимать любое количество элементов времени выполнения при инициализации и впоследствии могут быть увеличены / уменьшены. С наступающим C ++ 14 Standard, также будет 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>может взять Распределитель параметр шаблона. За std::vector этот распределитель по умолчанию std::allocator<T>, который выполняет динамическое низкоуровневое управление памятью за кулисами, используя new. За std::dynarray память выделяется из неопределенного источника, который может вызывать или не вызывать глобальный operator new,

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]