Я изучал всюду в книгах о Dymanic массивах. Я использовал их в STL C ++.
Но мне все еще неясно, что такое динамические массивы. Как реализованы операции над динамическими массивами.
В 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 распределитель стека.
Других решений пока нет …