Тема 24. std::vector (вектори) - динамічний масив PDF
Document Details
Uploaded by TimeHonoredVector2117
Tags
Summary
Цей документ описує використання динамічних масивів у C++, зокрема std::vector. Пояснюються основні концепції та методи роботи з цим типом даних. Підкреслюється вигода використання std::vector порівняно з традиційними методами динамічного виділення пам'яті.
Full Transcript
Тема 24. std::vector (вектори) – динамічний масив на «максималках» В попередній темі ми розглядали std::array, який є безпечнішою і зручнішою формою звичайних фіксованих масивів в мові C++. Аналогічно, в Стандартній бібліотеці C++ є поліпшена версія динамічних масивів (безпечніша і зручніша) — std::...
Тема 24. std::vector (вектори) – динамічний масив на «максималках» В попередній темі ми розглядали std::array, який є безпечнішою і зручнішою формою звичайних фіксованих масивів в мові C++. Аналогічно, в Стандартній бібліотеці C++ є поліпшена версія динамічних масивів (безпечніша і зручніша) — std::vector. На відміну від std::array, який недалеко відійшов від базового функціоналу звичайних фіксованих масивів, std::vector поставляється з додатковими можливостями, які роблять його одним з найбільш корисних і універсальних інструментів в мові C++. Вектори Представлений в C++03, std::vector (або просто “вектор”) — це той же динамічний масив, але який може сам керувати виділеною йому пам’яттю. Це означає, що ви можете створювати масиви, довжина яких задається під час виконання, без використання операторів new і delete (явної вказівки на виділення і звільнення пам’яті). std::vector знаходиться в заголовку vector. Оголошення std::vector наступне: #include // Немає необхідності вказувати довжину при ініціалізації std::vector array; std::vector array2 = { 10, 8, 6, 4, 2, 1 }; // використовується список ініціалізаторів для ініціалізації масиву std::vector array3 { 10, 8, 6, 4, 2, 1 }; // використовується uniform-ініціалізація для ініціалізації масиву (починаючи з C++11) Зверніть увагу, що як і в неініціалізованому, так і в ініціалізованому випадках вам не потрібно явно вказувати довжину масивів. Це пов’язано з тим, що std::vector динамічно виділяє пам’ять для свого вмісту за запитом. Подібно std::array, доступ до елементів масиву може виконуватися як через оператор [] (який не виконує перевірку діапазону), так і через функцію at() (яка виконує перевірку діапазону): array = 3; // без перевірки діапазону array.at(8) = 4; // з перевіркою діапазону У будь-якому випадку, якщо ви будете надавати запит на елемент, який знаходиться поза діапазоном array, довжина вектора автоматично змінюватися не буде. Починаючи з C++11, ви також можете присвоювати значення для std::vector, використовуючи список ініціалізаторів: array = { 0, 2, 4, 5, 7 }; // ок, довжина array тепер 5 array = { 11, 9, 5 }; // ок, довжина array тепер 3 В такому випадку вектор самостійно змінюватиме свою довжину, щоб відповідати кількості наданих елементів. Коли змінна-вектор виходить з області видимості, вона автоматично звільняє пам’ять, яку контролювала (займала). Це не тільки зручно (так як вам не потрібно це робити вручну), але також допомагає запобігти витокам пам’яті. Розглянемо наступний фрагмент: void doSomething(bool value) { int *array = new int { 12, 10, 8, 6, 4, 2, 1 }; if (value) return; // Робимо що-небудь delete[] array; // якщо value == true, то цей стейтмент ніколи не виконається } Якщо змінній value присвоїти значення true, то array ніколи не буде видалений, пам’ять ніколи не буде звільнена і станеться витік пам’яті. Однак, якби array був вектором, то подібне ніколи б і не сталося, оскільки пам’ять звільнялася б автоматично при виході array з області видимості (незалежно від того, чи вийде функція раніше з області видимості чи ні). Саме через це використання std::vector є безпечнішим, ніж динамічне виділення пам’яті через оператор new. Довжина векторів На відміну від стандартних динамічних масивів, які не знають свою довжину, std::vector свою довжину запам’ятовує. Щоб її дізнатися, потрібно використати функцію size(): #include #include int main() { std::vector array { 12, 10, 8, 6, 4, 2, 1 }; std::cout