Материалы книги получены с http://www.itlibitum.ru/
Операторы коллекций
Многие коллекции индексируются одним или несколькими способами и хорошо соответствуют оператору [], однако в нашем обсуждении курсоров и итераторов нигде не выдвигалось требование непременно использовать оператор [] или индексировать коллекцию. Курсор лишь определяет некоторую внутреннюю позицию в коллекции; эта позиция не обязана быть чем-то понятным или представляющим интерес для пользователя. Если убрать из функции 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; // Истинно, если элемент
// принадлежит множеству, но не является единственным
bool operator>=(const Element*) const; // Истинно, если элемент
// принадлежит множеству
bool operator==(const Element*) const; // Истинно, если элемент
// является единственным элементом множества
};
Существует еще один вариант перегрузки оператора, о котором я вынужден упомянуть. Я так и не привык к операторам << и >> в качестве операторов «поразрядных сдвигов» в поток и из него, но поскольку они прочно внедрились в культуру С++, эту идиому приходится использовать хотя бы как базу для дальнейшихрасширений. Это приводит нас к дополнительному применению << и >> в контексте коллекций и итераторов:
Оператор << может использоваться в итераторах как синоним функции Next().
Оператор >> может использоваться как синоним более длинного оператора Set&
operator|=(Element*) для «сдвига» новых элементов в коллекцию.
В обоих идиомах оператор должен перегружаться в форме внешней функции, поскольку в левой части оператора находится Element*, а не Set. Идиома >> выглядит наиболее естественно для коллекций, сохраняющих исходный порядок вставки (например, списков).
Мы вернемся к этой теме в части 3 при обсуждении гомоморфных иерархий классов.
Назад Содержание Далее
|