|
Операторы коллекций Многие коллекции индексируются одним или несколькими способами и хорошо соответствуют оператору [], однако в нашем обсуждении курсоров и итераторов нигде не выдвигалось требование непременно использовать оператор [] или индексировать коллекцию. Курсор лишь определяет некоторую внутреннюю позицию в коллекции; эта позиция не обязана быть чем-то понятным или представляющим интерес для пользователя. Если убрать из функции 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 при обсуждении гомоморфных иерархий классов. |
Copyright 2005. Климов Александр. All Right Reserved.