c.push_back(х);
push_heap(c.begin(), c.end(), comp);
}
void pop() {
pop_heap(c.begin(), c.end(), comp);
с.рор_bасk();
}
}; // Никакое равенство не обеспечивается
Адаптеры итераторов (Iterator adaptors)
Обратные итераторы (Reverse iterators)
Двунаправленные итераторы и итераторы произвольного доступа имеют соответствующие адаптеры обратных итераторов, которые выполняют итерации через структуру данных в противоположном направлении.Они имеют те же самые сигнатуры, как и соответствующие итераторы. Фундаментальное соотношение между обратным итератором и его соответствующим итератором i установлено тождеством &*(reverse_iterator(i))==&*(i - 1). Это отображение продиктовано тем, что, в то время как после конца массива всегда есть указатель, может не быть допустимого указателя перед началом массива.
template ‹class BidirectionalIterator, class T, class Reference = T&, class Distance = ptrdiff_t›
class reverse_bidirectionaiIterator : public bidirectional_iterator‹T, Distance› {
typedef reverse_bidirectional_iterator‹BidirectionalIterator, T, Reference, Distance› self;
friend bool operator==(const self& х, const self& y);
protected:
BidirectionalIterator current;
public:
reverse_bidirectional_iterator() {}
reverse_bidirectional_iterator(BidirectionalIterator х) : current(х) {}
BidirectionalIterator base() {return current;}
Reference operator*() const {
BidirectionalIterator tmp = current;
return *--tmp;
}
self& operator++() {
--current;
return *this;
}
self operator++(int) {
self tmp = *this;
--current;
return tmp;
}
self& operator--() {
++current;
return *this;
}
self operator--(int) {
self tmp = *this;
++current;
return tmp;
}
};
template ‹class BidirectionalIterator, class T, class Reference, class Distance›
inline bool operator==(const reverse_bidirectional_iterator‹BidirectionalIterator, T, Reference, Distance›& x, const reverse_bidirectional_iterator‹BidirectionalIterator,
T, Reference, Distance›& y) {
return x.current==y.current;
}
template ‹class RandomAccessIterator, class T, class Reference = T&, class Distance = ptrdiff_t›
class reverse_iterator: public random_access_iterator‹T, Distance› {
typedef reverse_iterator‹RandomAccessIterator, T, Reference, Distance› self;
friend bool operator==(const self& x, const self& y);
friend bool operator‹(const self& x, const self& y);
friend Distance operator-(const self& x, const self& y);
friend self operator+(Distance n, const self& x);
protected:
RandomAccessIterator current;
public:
reverse_iterator() {}
reverse_iterator(RandomAccessIterator x): current (x) {}
RandomAccessIterator base() {return current;}
Reference operator*() const {
RandomAccessIterator tmp = current;
return *--tmp;
}
self& operator++() {
--current;
return *this;
}
self operator++(int) {
self tmp = *this;
--current;
return tmp;
}
self& operator--() {
++current;
return *this;
}
self operator--(int) {