Динамічна ідентифікація типів

Динамічна ідентифікація типу (RTTI-Run-Time Type Identification) характерна для мов, в яких підтримується поліморфізм. У цих мовах можливі ситуації, в яких тип об'єкту на етапі компіляції невідомий.

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

Інформацію про тип об'єкта отримують за допомогою оператора typeid. при використанні якого слід підключити заголовний файл

Оператор typeid має дві форми:

1. typeid (об'єкт)

2. typeid (імя_тіпа)

Оператор typeid повертає посилання на об'єкт типу type_info.

У класі type_info визначені наступні відкриті члени:

bool operator == (const type_infoob) const;

bool operator! = (const type_infoob) const;

const char * name () const;

Перевантажені операції == і! = Забезпечують порівняння типів.

Функція name () повертає покажчик на ім'я типу.

Оператор typeid має одне обмеження. Він працює коректно лише з об'єктами, у яких визначені віртуальні функції. Коли оператор typeid застосовують до неполіморфному класу (в класі немає віртуальної функції), отримують покажчик або посилання базового типу.

using namespace std;

У програмі визначається вектор, заповнюється випадковими числами і сортується.

В якості самостійної роботи напишіть шаблон функції швидкого сортування послідовностей будь-якого типу.

Асоціативні контейнери - це узагальнення поняття асоціативного масиву.

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

Асоціативний масив, який часто називають відображенням (map), а іноді словником (dictionary), містить пари значень. Знаючи одне значення, зване ключем (key), ми можемо отримати доступ до іншого, званого відображеним значенням (mapped value).

Асоціативний масив можна представити як масив, для якого індекс не обов'язково повинен мати цілочисельний тип:

template class Assoc

V operator [] (const K);

Тут operator [] повертає посилання на елемент V, відповідний ключу K.

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

(Тобто set містить одні ключі).

Контейнери map і multimap

Це послідовність пар (ключ, значення), яка забезпечує швидке отримання значення по ключу. Контейнер map надає двонаправлені ітератори.

Контейнер map вимагає, щоб для типів ключа існувала операція "<”. Он хранит свои элементы отсортированными по ключу так, что перебор происходит по порядку.

Специфікація шаблону для класу map:

template,

class Allocator = allocator> Class std :: map

У класі map визначені наступні конструктори:

explicit map (const Comp c = Comp (),

const Allocator a = Allocator ());

map (const map ob);

template map (InIter first, InIter last, const Comp c = Comp (), const Allocator a = Allocator ());

Перша форма являє собою конструктор порожнього асоціативного контейнера. Друга - конструктор копії. Третя - конструктор асоціативного контейнера, що містить діапазон елементів.

У класі визначена операція присвоювання:

map operator = (const map);

Визначено також наступні операції порівняння: ==, <, <=. =,>,> =.

Пари ключ / значення зберігаються в контейнері у вигляді об'єктів типу pair. Тип pair - це клас, точніше шаблон класу.

template struct pair

typedef Key TFirst; // тип ключа

typedef V TSecond; // тип значення

pair (const Key x, const V y): first (x), second (y)<>

template pair (const pair ob): first (ob.first), second (ob.second)<>

Останній конструктор існує для того, щоб дозволити перетворення в ініціалізатор. наприклад:

pair f (char c, int i)

Створювати пари ключ / значення можна не тільки за допомогою конструкторів класу pair, але і за допомогою функції make_pair. яка створює об'єкти типу pair, використовуючи типи даних в якості параметрів.

template pair

std :: make_pair (const T1 t1, const T2 t2)

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

Що стосується реалізації контейнера map, то він, швидше за все, реалізований з використанням будь-якої форми дерева, і ітератори для map забезпечують деякий спосіб проходу по дереву. Така реалізація забезпечує швидкий пошук значення по ключу.

Схожі статті