Программирование. Принципы и практика использования C++ Исправленное издание, стр. 282
20.8. Адаптация нашего класса vector к библиотеке STL
После добавления функций
begin()end()typedefinsert()erase()std::vectortemplate<class T, class A = allocator<T> > class vector { int sz; // размер T* elem; // указатель на элементы int space; // количество элементов плюс количество свободных ячеек A alloc; // использует распределитель памяти для элементовpublic: // ...все остальное описано в главе 19 и разделе 20.5... typedef T* iterator; // T* — максимально простой итератор iterator insert(iterator p, const T& val); iterator erase(iterator p);};Здесь мы снова в качестве типа итератора использовали указатель на элемент типа
T*
insert()erase()vectorinsert()erase()push_back()По существу, мы реализовали функцию
vector<T,A>::erase()vectortemplate<class T, class A>vector<T,A>::iterator vector<T,A>::erase(iterator p){ if (p==end()) return p; for (iterator pos = p+1; pos!=end(); ++pos) *(pos–1) = *pos; // переносим элемент на одну позицию влево alloc.destroy(&*(end()-1)); // уничтожаем лишнюю копию // последнего элемента ––sz; return p;}Этот код легче понять, если представить его в графическом виде.

Код функции
erase()vectorp==end()Реализация функции
vector<T,A>::insert()template<class T, class A>vector<T,A>::iterator vector<T,A>::insert(iterator p, const T& val){ int index = p–begin(); if (size()==capacity()) reserve(size() = 0 ? 8 : 2*size()); // убедимся, что // есть место // сначала копируем последний элемент в неинициализированную ячейку: alloc.construct(elem+sz,*back()); ++sz; iterator pp = begin()+index; // место для записи значения val for (iterator pos = end()–1; pos!=pp; ––pos) *pos = *(pos–1); // переносим элемент на одну позицию вправо *(begin()+index) = val; // "insert" val return pp;}Обратите внимание на следующие факты.
• Итератор не может ссылаться на ячейку, находящуюся за пределами последовательности, поэтому мы используем указатели, такие как
elem+space• Когда мы используем функцию
reserve()• Наше использование распределителя памяти
A• Тонкости, подобные этим, позволяют избежать непосредственной работы с памятью на нижнем уровне. Естественно, стандартный класс
vectorПо причинам, связанным с эффективностью, мы не должны применять функции
insert()erase()listinsert()erase()