structinput_iterator_tag {}; structoutput_iterator_tag {}; structforward_iterator_tag : public input_iterator_tag {}; structbidirectional_iterator_tag : public forward_iterator_tag {}; structrandom_access_iterator_tag : public bidirectional_iterator_tag {};
// Base iterator template template <typename Category, typename T, typename Distance = ptrdiff_t, typename Pointer = T*, typename Reference = T&> struct iterator { using iterator_category = Category; using value_type = T; using difference_type = Distance; using pointer = Pointer; using reference = Reference; };
// Iterator traits template template <typename Iterator> structiterator_traits { using iterator_category = typename Iterator::iterator_category; using value_type = typename Iterator::value_type; using difference_type = typename Iterator::difference_type; using pointer = typename Iterator::pointer; using reference = typename Iterator::reference; };
// Specialization for pointer types template <typename T> structiterator_traits<T*> { using iterator_category = random_access_iterator_tag; using value_type = T; using difference_type = ptrdiff_t; using pointer = T*; using reference = T&; };
// Specialization for const pointer types template <typename T> structiterator_traits<const T*> { using iterator_category = random_access_iterator_tag; using value_type = T; using difference_type = ptrdiff_t; using pointer = const T*; using reference = const T&; };
// calculate the distance between two iterators template <typename InputIterator> typename iterator_traits<InputIterator>::difference_type distance(InputIterator first, InputIterator last){ using category = typename iterator_traits<InputIterator>::iterator_category; returndistance_impl(first, last, category()); }
// position of the iterator template <typename InputIterator, typename Distance> voidadvance(InputIterator& it, Distance n, input_iterator_tag){ while (n--) ++it; }
template <typename BidirectionalIterator, typename Distance> voidadvance(BidirectionalIterator& it, Distance n, bidirectional_iterator_tag){ if (n >= 0) { while (n--) ++it; } else { while (n++) --it; } }
template <typename RandomAccessIterator, typename Distance> voidadvance(RandomAccessIterator& it, Distance n, random_access_iterator_tag){ it += n; }
template <typename Iterator, typename Distance> voidadvance(Iterator& it, Distance n){ using category = typename iterator_traits<Iterator>::iterator_category; advance(it, n, category()); }
template <classT> classMyAllocator { public: // Define value_type as T using size_type = std::size_t; // Define difference_type as a signed integral type using difference_type = std::ptrdiff_t;
using value_type = T; using pointer = value_type*; using const_pointer = const value_type*; using reference = T&;