Контейнери STL. Частина 2




Контейнери C ++ STL , Стандартна бібліотека шаблонів, контейнер з ++, vector

STL вводить ряд понять і структур даних, які майже у всіх випадках дозволяють сильно спростити програмний код. Вводяться наступні категорії понять:

  1. контейнер - Зберігання набору об'єктів в пам'яті.

  2. Итератор - засіб доступу до вмісту окремих об'єктів в контейнері.

  3. алгоритм - Визначення найбільш стандартних обчислювальних процедур на контейнерах.

  4. адаптер - Адаптація основних зас категорій для забезпечення найбільш уживаних інтерфейсів (таких як стек або черга).

  5. Функтор (функціональний об'єкт) - Приховування функції в об'єкті для використання її іншими категоріями.

бібліотека STL - Це дуже велика область. Її опису присвячені цілі окремі книги (одна з кращих книг російською мовою, достатня для освоєння STL в деталях, показана в кінці тексту). Ми ж, в силу початкового рівня знайомства, розглянемо техніку STL на інтуїтивно ясних прикладах.

Синтаксис STL заснований на використанні таких синтаксичних конструкцій мови C ++ як шаблони (шаблони) класів і шаблони функцій. Але для успішного застосування техніки STL зовсім не обов'язково глибоке розуміння техніки шаблони.

центральним поняттям STL, навколо якого крутиться все інше, це контейнер (ще використовують термін колекція). Контейнер - це набір певної кількості однотипних елементів, упакованих в контейнер певним чином. Найпростішим прототипом контейнера в класичному мовою C ++ є массив. той спосіб, яким елементи упаковуються в контейнер, визначає тип контейнера і особливості роботи з елементами в такому контейнері. STL вводить цілий ряд різноманітних типів контейнерів:

  • послідовні контейнери - вектор (vector), двусвязний список (list), ДЕК (deque);

  • асоціативні контейнери - безлічі (комплект і мультімножество ), хеш-таблиці (карта і MultiMap);

  • псевдо-контейнери - бітові маски (BitSet), строки (string і wstring), массивы (valarray);

Ми послідовно розглянемо на прикладах використання основних контейнерів, переходячи від більш простих до складних. Найпростішим типом з них є вектор. Близьким прототипом вектора є масив С ++. Але розмір вектора в будь-який час може динамічно змінюватися операціями додавання (метод push_back()) або видалення елемента. Також, як і для масиву, ми можемо звернутися до довільного елементу вектора операцією індексації [n]. Це вже і є перший, поверхневий шар знань про vector, який дозволяє нам почати з ним працювати:

опис vector<float> (це і є згадуваний раніше template в описі класу) оголошує в коді об'єкт array: вектор елементів типу float.

Далі ми бачимо такі методи класу vector<float>, як max_size() - Максимально можлива довжина векторів взагалі (константа реалізації); size() - Поточний розмір (число елементів) вектора; ємність() - Поточна ємність вектора (максимальне число елементів, яке може бути вміщено в вектор в поточному його розміщенні). Виконання цього фрагмента дасть щось приблизно наступне (деталі можуть відрізнятися в залежності від реалізації):

Контейнери C ++ STL , Стандартна бібліотека шаблонів, контейнер з ++, vector

Тут видно досить цікаве поведінку вектора (в цьому і його сенс): як тільки при додаванні чергового елемента, ємності вектора стає недостатньо, робиться нове розміщення вектора, резервуючи для нього подвоєну ємність (з запасом, щоб наступне ж додавання нового елемента не зажадало відразу ж нового перерозміщення).

Таким чином ми отримали еквівалент масиву C ++, розмір якого (size()) змінюється в довільних межах від декількох одиниць до мільйонів елементів. звернемо увагу (це дуже важливо), що збільшення розміру вектора досягається не індексацією за межі його поточного розміру, і "zatalkivaniem» (метод push_back()) нового елемента в кінець вектора. Інший спосіб змінити розмір вектора - це викликати методи змінити розмір(). Саме тому, для вектора передбачено 2 різних способу індексації: операция [n] і метод-функція at(n). метод at() перевіряє поточний розмір вектора size(), і при індексації за його кордон спрацьовує виняток (це помилка!). навпаки, операція індексації не перевіряє кордон, що небезпечно, але зате це швидше.

Контейнери C ++ STL , Стандартна бібліотека шаблонів, контейнер з ++[1] Мейерс Скотт, Ефективне використання STL, «Пітер» СПб. 2002, ISBN: 5-94723-382-7, 244 стр. За посиланням можна читати книгу online.

Нові уроки з програмування:

дата
сторінка
Контейнери STL. Частина 2
рейтинг
51зірка1зірка1зірка1зірка1зірка
Olej

Про Olej

Стаж практичних програмних розробок близько 40 лет. Викладач міжнародної софтверної компанії Global Logic. Постійний автор публікацій IBM Developer Works. Науковий редактор книжкового видавництва комп'ютерної літератури "Символ-Плюс", Санкт-Петербург.

залишити коментар

Код розміщуйте в тегах: <pre class="lang:C ++ декодуванням:true ">ВАШ КОД</заздалегідь>