C++: библиотека программиста



Download 1,95 Mb.
Pdf ko'rish
bet77/144
Sana24.02.2022
Hajmi1,95 Mb.
#223123
TuriРеферат
1   ...   73   74   75   76   77   78   79   80   ...   144
Bog'liq
C -Eldjer-Djeff-for-Real-Programmers-RUS-www.itlibitum.ru

 
131 
вставки. Существуют и другие возможности реализации (например, через списки исключений), однако 
методика журналов удалений по крайней мере демонстрирует концепцию. 
Внешний итератор с временной пометкой 
Внешний итератор представляет собой тривиальную оболочку для только что описанного внутреннего 
итератора: 
class RealExternalIterator : public ExternalIterator { 
private: 
InternalIterator* 
iter; 
Timestamp 
my_time; 
// 
Время конструирования ‘this’ 
bool 
Accept(Foo*); 
// 
Фильтрующая функция 
public: 
RealExternalIterator(Collection* c) : iter(c->Iterator()) {} 
virtual bool More() { 
while 
(iter.More(my_time)) 

if 
(Accept(iter->Peek(my_time))) 
return 
true; 
(void)iter->Next(my_time); 

return 
false; 

virtual Foo* Next() { return iter->Next(my_time); } 
}; 
Безаргументный конструктор 
Timestamp
использует для пометки текущее время. Во многих ситуациях 
функция 
Accept()
всегда возвращает 
true
, и ее можно убрать. 
Пример 
Давайте завершим эту затянувшуюся главу примером — шаблоном для набора объектов, тип которых 
определяется параметром шаблона. В этом наборе каждый объект присутствует ровно один раз; при 
попытке снова вставить уже существующий объект набор остается без изменений. Для реализации 
надежных итераторов будет использована методика временных пометок вместо частных копий, 
создаваемых при конструировании итератора. Заодно мы посмотрим, на какие ухищрения порой 
приходится идти, чтобы разумно использовать неразумные коммерческие классы. 
Ненадежный коммерческий класс словаря 
В реальном мире редко приходится начинать с пустого места. Обычно в вашем распоряжении уже 
имеются готовые классы коллекций. Даже если они работают не совсем так, как хочется, по крайней 
мере они избавят вас от нудного переписывания любимых глав из книг Кнута при реализации базовых 
структур данных. В том же реальном мире эти классы обычно не обращают особого внимания на 
проблему надежности итераторов, так что наш пример никак не назовешь абстрактным. Для пущего 
реализма мы будем считать, что коллекция представляет собой словарь, который индексирует значение 
типа 
void*
и возвращает 
void*
в качестве ключа. Имеется пассивный итератор 
Slot
, реальная 
структура которого спрятана глубоко внутри класса словаря. Открытый интерфейс выглядит так: 
class Dictionary { 
public: 
Dictionary(); 
// 
Создает пустой словарь 
Dictionary(const 
Dictionary&); 
// 
Конструктор копий 
~Dictionary(); 
Dictionary& operator=(const Dictionary&); 
void AddEntry(void* key, void* value); 


 132 
bool At(void* key, void*& value); 
void RemoveEntry(void* key); 
typedef void* Slot; 
// Настоящее объявление надежно спрятано 
Slot 
First(); 
// 
Возвращает Slot для перебора 
// 
Эквивалент нашей функции “Peek” 
bool GetCurrent(Slot slot, void*& key, void*& value); 
// 
Эквивалент нашей функции “Next” 
bool GetNext(Slot& slot, void*& key, void*& value); 
}; 
Функция 
AddEntry()
заносит в словарь новое значение с заданным ключом. Если ключ уже 
существует для другого значения, значение заменяется новым. Функция 
At()
возвращает логический 
код, который показывает, присутствует ли ключ в словаре; если присутствует, функция возвращает 
true
и 
value
(значение, соответствующее данному ключу). Функция 
RemoveEntry()
удаляет ключ и 
связанное с ним значение. Функция 
First()
возвращает пассивный итератор, направленный таким 
образом, чтобы первый вызов 
GetNext()
возвратил первый элемент словаря. Функция 
GetCurrent()
возвращает пару ключ/значение, находящуюся в текущей позиции 
Slot
. Функция 
GetNext()
возвращает пару ключ/значение и перемещает итератор к следующему элементу. Единственное 
отличие между этими функциями заключается в перемещении логической позиции после получения 
объекта. 
Мы воспользуемся словарем следующим образом: ключом будет объект, хранящийся в нашем наборе, 
а значением этого ключа — журнал вставок/удалений для данного объекта. 
Класс журнала 
Ниже приведен открытый интерфейс класса, в котором хранится история вставок/удалений для 
объекта. Этот класс использует рассмотренный выше класс Timestamp — он образует вторую 
составляющую пар ключ/значение, хранящихся в словаре. В реализации нет ничего интересного, 
поэтому я ее пропускаю. 
class History { 
public: 
History(); // 
Пустой журнал 
void 
Insert(Timestamp); 
// 
Вставка в заданное время 
void 
Remove(Timestamp); 
// 
Удаление в заданное время 
bool 
Exists(Timestamp); 
// 
В заданное время 
bool 
Exists(); 
// 
В настоящий момент 
}; 
Функция 
Exists(Timestamp)
возвращает 
true
, если в заданное время последней операцией была 
вставка, и 
false
— если последней операцией было удаление или до этого времени вообще не было 
операций. Безаргументная функция 
Exists()
является синонимом для 
Exists(Timestamp)
с очень 
большим значением времени — то есть до настоящего момента. 
Абстрактный базовый класс 
Класс набора делится на две части: абстрактный базовый класс, работающий с 
void*
, и производный 
параметризованный класс, в который добавлена безопасность типов. Абстрактный базовый класс 
выглядит так: 
// В файле Set.h 
class SetBase : private Dictionary { 
friend class InternalIterator; 
protected: 
SetBase(); // 
Чтобы класс был абстрактным 



Download 1,95 Mb.

Do'stlaringiz bilan baham:
1   ...   73   74   75   76   77   78   79   80   ...   144




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish