std::vector
- клас шаблонів, який інкапсулює динамічний масив 1 , що зберігається в купі, який росте і скорочується автоматично, якщо елементи додаються або видаляються. Він надає всі гачки ( begin()
, end()
ітератори, і т.д.) , які роблять його роботу відмінно з іншою частиною STL. У ньому також є кілька корисних методів, які дозволяють виконувати операції, які в нормальному масиві були б громіздкими, як, наприклад, вставлення елементів в середину вектора (він обробляє всю роботу з переміщення наступних елементів за кадром).
Оскільки він зберігає елементи в пам'яті, виділеній на купі, він має деякі накладні витрати щодо статичних масивів.
std::array
- клас шаблонів, який інкапсулює масив статичного розміру, що зберігається всередині самого об'єкта, а це означає, що, якщо інстанціювати клас у стеці, сам масив опиниться у стеку. Його розмір повинен бути відомий під час компіляції (він передається як параметр шаблону), і він не може зростати або зменшуватися.
Це більш обмежено std::vector
, але часто ефективніше, особливо для невеликих розмірів, оскільки на практиці це в основному легка обгортка навколо масиву стилю С. Однак це більш безпечно, оскільки неявна конверсія в покажчик вимкнена, і вона забезпечує більшу частину функцій, пов'язаних з STL, std::vector
та інших контейнерів, тому ви можете легко використовувати його з алгоритмами STL & co. У всякому разі, для самого обмеження фіксованого розміру він набагато менш гнучкий, ніж std::vector
.
Для ознайомлення std::array
ознайомтеся з цією статтею ; для швидкого ознайомлення std::vector
з операціями, які можливі на ньому, ви можете переглянути його документацію .
Власне, я думаю, що в стандарті вони описуються з точки зору максимальної складності різних операцій (наприклад, випадковий доступ у постійному часі, ітерація над усіма елементами в лінійний час, додавання та видалення елементів наприкінці у постійному амортизованому часі, тощо), але AFAIK не існує іншого способу виконання таких вимог, крім використання динамічного масиву. Як зазначає @Lucretiel, стандарт фактично вимагає, щоб елементи зберігалися безперервно, тому це динамічний масив, який зберігається там, де його ставить асоційований розподільник.
std::vector
порівнянняstd::array
термінів.