Последовательные контейнеры должны поддерживать два варианта функции erase (). Первый — удаляет элемент, на который указывает итератор. В этом случае функция возвращает итератор, указывающий на элемент, расположенный следом за удаленным, или end(), если был удален последний элемент. Далее приведен первый вариант функции. // Стирает элемент по адресу р. template <class Т, class А> typename RangeArray<T, А>::iterator RangeArray<T, A>::erase(i terator p) { iterator q = p; // Уничтожает стертый элемент. if(p != end()) a.destroy(p); // Корректирует длину len и границы. \ len—; if (p < &arrayptr [abs (lowerbound) ]) lowerbound++; else upperbound—; // Уплотняет оставшиеся элементы, for( ; p < end(); p++) *p = Mp+D; 4 return q; } В этом варианте функции освобождается память, занимаемая стираемым элементом, корректируются нижняя или верхняя границы соответственно, и потом оставшиеся элементы уплотняются. Второй вариант функции, приведенный далее, определен с помощью первого варианта. В этом варианте стирается ряд элементов. Функция возвращает итератор, указывающий на последний элемент заданного ряда (т. е. на элемент по адресу stop). Таким образом, она удаляет элементы в диапазоне от start до stop-i включительно. // Стирает заданный диапазон элементов, iterator erase(iterator start, iterator stop) { iterator p = end(); for(int i=stop-start; i > 0; i—) р = erase(start); return p; } Функции Push и Pop В класс RangeArray включены приведенные далее следующие функции: push_back(), pop_back(), push_front() И pop_front(). Как видно из кода, они реализованы с помощью функций insert о и eraseo, и действие их очевидно. // Добавляет элемент в конец, void push_back(const T &val) { inserc(end(), val); } // Удаляет последний элемент. void pop_back() { erase(end()-1); } // Добавляет элемент в начало, void push_front(const T &val) { inserc(begin(), val); } // Удаляет начальный элемент. void pop_front() { erase(begin()); } Функции frontf) и back() Приведенные далее функции front о и back о просто возвращают итератор, указывающий на начало и конец массива соответственно. Их реализация проста и понятна. Обратите внимание на то, что необходимы оба варианта функций: константный и неконстантный. // Возвращает ссылку на первый элемент. T &front() { return arrayptr[0]; ) // Возвращает ссылку const на первый элемент. const Т &front() const { return arrayptr[0]; } // Возвращает ссылку на последний элемент. Т &back() { return arrayptr[len-1]; } // Возвращает ссылку const на последний элемент. const Т &back() const { return arrayptr[len-1]; >
|