#c #arrays #vector #data-structures
Вопрос:
Я увидел следующее по этой ссылке:
Векторы являются частью STL. Векторы в C — это контейнеры последовательностей, представляющие массивы, которые могут изменять свой размер во время выполнения . Они используют смежные места хранения для своих элементов так же эффективно, как и в массивах, что означает, что к их элементам также можно получить доступ, используя смещения в обычных указателях на их элементы.
Векторы — это динамические массивы, которые используются для хранения данных.Это отличается от массивов, которые хранят последовательные данные и являются статическими по своей природе, векторы обеспечивают большую гибкость программе. Векторы могут автоматически изменять свой размер при вставке или удалении элемента из него.
Если векторы могут сделать так много, при каких обстоятельствах мы все еще предпочитаем массивы?
Спасибо!
Комментарии:
1. Нет необходимости динамически выделять память, если размер массива известен во время компиляции и не является большим числом
2. Массивы немного быстрее создаются и уничтожаются и имеют немного меньшие (нулевые) накладные расходы на память.
3. Известен ли размер контейнера во время компиляции? Останется ли он того же размера на протяжении всего срока действия программы? Нормально ли, что данные контейнера могут быть выделены как локальная переменная (т. Е. в стеке), в зависимости от варианта использования? Затем перейдите к массиву.
4. @Эрин — Ты в курсе, что
std::array
это существует? Кроме того, эта ссылка у вас есть такая:#include <bits/stdc .h>
— Не изучайте C с этого сайта.5. @Erin: Да, несколько.
vector
Потребностиnew
иdelete
память для хранения объектов, что занимает определенное время, а также содержит внутренние элементы данных для отслеживания размера, емкости, указателя на данные и т. Д. ( Здесь 24 байта ), Которые занимают память сверх того, что необходимо для хранения объектов. Необработанные массивы иstd::array
ничего из этого нет.
Ответ №1:
Если векторы могут сделать так много, при каких обстоятельствах мы все еще предпочитаем массивы?
Хороший дизайн-это не тогда, когда нечего добавить, а когда нечего удалить. Или вводить дополнительную сложность только тогда, когда это необходимо.
Ответ №2:
Одним из основных недостатков std::vector
является то, что он использует динамическое выделение памяти всякий раз, когда он должен увеличиваться, что может быть довольно дорогостоящим с точки зрения времени выполнения. Поэтому в ситуациях, когда известен разумный верхний предел, может быть лучше использовать массив фиксированной длины, даже если при этом теряется место в памяти. Это решение является компромиссом между пространством и временем.
Однако этот недостаток std::vector
может быть смягчен путем предварительного резервирования памяти для определенного количества элементов путем вызова std::vector::reserve
.
Еще одним недостатком использования std::vector
является то, что сериализация значительно сложнее. Например, если вы сделаете std::array
a членом a struct
, то вы можете просто скопировать все struct
содержимое байт за байтом, чтобы сериализовать его. Однако это невозможно, если вы сделаете std::vector
a членом a struct
, так как он , вероятно, не будет хранить фактические данные внутри struct
, а, вероятно, будет хранить только указатель на данные. Таким образом, вы не сможете сериализовать файл struct
, просто скопировав его в память struct
. Вместо этого сериализация std::vector
потребует специального обращения.
Комментарии:
1. Но если контейнеру нужно расти, то массив изначально не был вариантом.
2. @NateEldredge: В зависимости от ситуации может быть известен разумный верхний предел, и массив может быть выполнен такого размера. Однако вы правы в том, что во многих ситуациях это, вероятно, будет пустой тратой места. Поэтому решение о том, использовать a
std::vector
или astd::array
, часто является компромиссом между пространством и временем.