Язык программирования C++ для профессионалов




Ассоциативный массив - часть 4


operator void*() { return p; }

const K& key(); V& value();

Mapiter& operator--(); // префиксная void operator--(int); // постфиксная Mapiter& operator++(); // префиксная void operator++(int); // постфиксная };

После позиционирования итератора функции key() и value() из Mapiter выдают ключ и значение того элемента, на который установлен итератор.

template<class K, class V> const K& Mapiter<K,V>::key() { if (p) return p->key; else return m->def_key; }

template<class K, class V> V& Mapiter<K,V>::value() { if (p) return p->value; else return m->def_val; }

По аналогии с указателями определены операции ++ и -- для продвижения по элементам Map вперед и назад:

Mapiter<K,V>& Mapiter<K,V>::operator--() //префиксный декремент { if (p) p = p->pre; return *this; }

void Mapiter<K,V>::operator--(int) // постфиксный декремент { if (p) p = p->pre; }

Mapiter<K,V>& Mapiter<K,V>::operator++() // префиксный инкремент { if (p) p = p->suc; return *this; }

void Mapiter<K,V>::operator++(int) // постфиксный инкремент { if (p) p = p->suc; }

Постфиксные операции определены так, что они не возвращают никакого значения. Дело в том, что затраты на создание и передачу нового объекта Mapiter на каждом шаге итерации значительны, а польза от него будет не велика.

Объект Mapiter можно инициализировать так, чтобы он был установлен на начало Map:

template<class K, class V> Mapiter<K,V>::Mapiter(Map<K,V>& mm) { m == &mm; p = m->head; }

Операция преобразования operator void*() возвращает нуль, если итератор не установлен на элемент Map, и ненулевое значение иначе. Значит можно проверять итератор iter, например, так:

void f(Mapiter<const char*, Shape*>& iter) { // ... if (iter) { // установлен на элемент таблицы } else { // не установлен на элемент таблицы }

// ... }

Аналогичный прием используется для контроля потоковых операций ввода-вывода в §10.3.2.

Если итератор не установлен на элемент таблицы, его функции key() и value() возвращают ссылки на стандартные объекты.

Если после всех этих определений вы забыли их назначение, можно привести еще одну небольшую программу, использующую таблицу Map. Пусть входной поток является списком пар значений следующего вида:




Содержание  Назад  Вперед