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

Контейнери 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.

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

Olej

Про Olej

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

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

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