Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / C++ for real programmers.pdf
Скачиваний:
262
Добавлен:
02.05.2014
Размер:
2.04 Mб
Скачать

123

Инкапсулируйте SparseArray::Iterator, превратив его в абстрактный базовый класс, а затем верните производный класс из скрытой реализации NonEmpty() (эта идея также хорошо подходит для классов массива и курсора, поэтому мы разовьем ее в части 3).

Предоставьте дополнительные итераторы, которые включают как пустые, так и непустые ячейки.

Гарантируйте определенный порядок перебора ячеек.

Возвращайте из Next() курсор, а не указатель, чтобы клиенты могли изменять содержимое ячейки во время перебора. Если это будет сделано, индекс может храниться в курсоре, поэтому отпадает необходимость возвращать его в виде отдельного ссылочного аргумента Next().

Операторы коллекций

Многие коллекции индексируются одним или несколькими способами и хорошо соответствуют оператору [], однако в нашем обсуждении курсоров и итераторов нигде не выдвигалось требование непременно использовать оператор [] или индексировать коллекцию. Курсор лишь определяет некоторую внутреннюю позицию в коллекции; эта позиция не обязана быть чем-то понятным или представляющим интерес для пользователя. Если убрать из функции Next() аргумент Index&, описанный итератор можно будет с таким же успехом использовать не для массива, а для чего-то совершенно иного.

В большинстве коллекций имеются общие операции. Как и в случае с оператором [], операторы С++ обычно перегружаются для получения более понятного и удобочитаемого кода. Хотя не существует повсеместного стандарта операторов коллекций, приведенный ниже перечень поможет вам начать ваши собственные разработки. Во всех приведенных операторах сохраняется семантика соответствующих операций с числами.

template <class Element>

 

class Set {

 

public:

 

Set();

// Пустое множество

Set(const Set<Element>&); // Дублировать множество

Set(Element*);

// Множество с одним исходным элементом

//Бинарные операции и операции отношения (множество, множество)

//(также варианты |=, &=, -=, <, <=)

Set<Element> operator|(const Set<Element>&) const;

// Объединение

 

// множеств

Set<Element> operator&(const Set<Element>&) const;

// Пересечение

Set<Element> operator-(const Set<Element>-) const;

// Разность

 

// множеств

bool operator>(const Set<Element>&) const; // Истинно, если this

// является

точным надмножеством аргумента

bool operator>=(const Set<Element>&)

const; // Истинно, если this

// является

надмножеством аргумента

bool operator==(const Set<Element>&)

const; // Истинно, если множества

//имеют одинаковое содержимое

//Бинарные операции и операции отношения (множество, элемент*)

//(также варианты |=, -=)

Set<Element> operator|(Element*);

// Добавить

элемент в this

Set<Element> operator-(Element*);

// this минус элемент

bool operator>(const Element*) const;

// Истинно,

если элемент

// принадлежит множеству, но не является единственным