Приклад класу контейнера

Цей розділ знаходиться в документації по Visual C ++ як непрацюючий прикладом контейнери, які використовуються в стандартній бібліотеці C ++. Додаткові відомості див. У розділі контейнери STL.

Описує об'єкт, керуючий послідовністю елементів, зазвичай типу змінної довжини Ty. Послідовність зберігається по-різному в залежності від фактичних контейнера.

Може виявитися контейнера конструктора або функції-члена, викличте конструктор в рідкісних випадках Ty (const Ty ) Або функція Ty :: operator = (const Ty ). Якщо такий виклик породжує виключення, об'єкт-контейнер є obliged для збереження цілісності і заново створити будь-який виняток, він перехоплює. Можна безпечно заміни, призначити, видалити або знищити об'єкт контейнера, після його створює одне з цих винятків. В цілому проте, неможливо в іншому випадку передбачити стан послідовності, контрольованої об'єкт контейнера.

Кілька додаткових попередження:

Ty створив виняток, результуюче стан об'єкта контейнера не визначене.

Якщо контейнер, які зберігають об'єкт розподільника al. і al викликає виняток, відмінне від в результаті виклику al.allocate. результуюче стан об'єкта контейнера не визначене.

Якщо контейнер зберігає об'єкт функції comp. щоб визначити спосіб упорядкування керованої послідовності і comp видає виключення будь-якого типу, результуюче стан об'єкта контейнера не визначене.

Класи контейнерів, який визначається STL задовольняють кілька додаткових вимог, як описано в наступних абзацах.

Клас шаблонів контейнерів списку забезпечує поведінку детермінованих і корисні, навіть при наявності винятків, описаних вище. Наприклад якщо виняток під час вставки одного або більше елементів контейнера змінюється, а виняток створюється знову.

Для все контейнера класи, певні STL, якщо виключення при виклику наступної функції-члени:

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

Крім того виняток не виникає при копіюванні итератор, що повертається функцією-членом.

Функція-член заміни забезпечує додаткових переваг все визначається STL класи контейнерів:

Функція-член тільки в тому випадку, якщо контейнер зберігає al об'єкт розподільника, створюється виключення і al викликає виключення при копіюванні.

Посилання, покажчики і ітератори, що позначають елементи керованої послідовності їх перемиканням залишаються дійсними.

Об'єкт класу контейнера, який визначається STL виділяє і звільняє сховище для послідовності, вона управляє через збережений об'єкт типу Alloc. який зазвичай є параметром шаблону. Такий об'єкт розподільника повинен мати такий же зовнішній інтерфейс, як об'єкт класу розподільника . Зокрема Alloc повинен бути того ж типу, як Alloc :: rebind . інших

Для всіх класів контейнерів визначається STL, функція-член get_allocator Alloc const; повертає копію збережений об'єкт розподільника. Зверніть увагу, що збережений об'єкт розподільника не буде копіюватися при призначається об'єкт контейнера. Всі конструктори виконують ініціалізацію значення, що зберігається в розподільника. в Alloc Якщо конструктор містить параметр не розподільника.

Відповідно до стандарту C ++ клас контейнера, який визначається STL можна припускати, що:

Всі об'єкти класу Alloc порівняння рівності.

Тип Alloc :: const_pointer збігається const Ty *.

Тип Alloc :: const_reference збігається const Ty .

Проте, в цій реалізації контейнери не робити такі спрощуючи припущень. Таким чином вони коректно працювати з об'єктами розподільника, які є більш істотних:

Всі об'єкти класу Alloc не потрібно порівнювати рівні. (Можна підтримувати кілька пулів носіїв).

Тип Alloc :: const_pointer не повинні збігатися з const Ty *. (Константний покажчик може бути класом.)

Тип Alloc :: pointer не повинні збігатися з Ty *. (Покажчик може бути класом.)

Схожі статті