Книга: Эффективное использование STL

Шаблоны функций классов в STL

Шаблоны функций классов в STL

Допустим, у вас есть два вектора объектов Widget, требуется скопировать объекты Widget из одного вектора в конец другого. Задача решается легко — достаточно воспользоваться интервальной функцией insert контейнера vector:

vector<Widget> vw1, vw2;

vw1.insert(vw1.end(), vw2.begin(), vw2.end()); // Присоединить к vw1 копию
                                               // объектов Widget из vw2

Аналогичную операцию можно выполнить с контейнерами vector и deque:

vector<Widget> vw;
deque<Widget> dw;

vw.insert(vw.end(), dw.begin(), dw.end()); // Присоединить к vw копию
                                           // объектов Widget из dw

Оказывается, эту операцию можно выполнить независимо от того, в каких контейнерах хранятся копируемые объекты. Подходят даже нестандартные контейнеры:

vector<Widget> vw;

list<Widget> lw;

vw.insert(vw.begin(), lw.begin(), lw.end()); // Присоединить к vw копию
                                             // объектов Widget из lw
set<Widget> sw;

vw.insert(vw.begin(), sw.begin(), sw.end()); // Присоединить к vw копию
                                             // объектов Widget из sw
template<typename T,
 typename Allocator = allocator<T> > // Шаблон нестандартного
 class SpecialContainer{…};          // STL-совместимого контейнера
SpecialContainer<Widget> scw;
vw.insert(vw.begin(), scw.begin(), scw.end()); // Присоединить к vw копию
                                               // объектов Widget из scw

Подобная универсальность объясняется тем, что интервальная функция insert контейнера range вообще не является функцией в общепринятом смысле. Это шаблон функции контейнера, специализация которого с произвольным типом итератора порождает конкретную интервальную функцию insert. Для контейнера vector шаблон insert объявлен в Стандарте следующим образом:

template <class T, class Allocator = allocator<T> >
class vector {
public:
 …
 template<class InputIterator>
 void insert(iterator position, InputIterator first, InputIterator last);
};

Каждый стандартный контейнер должен поддерживать шаблонную версию интервальной функции insert. Аналогичные шаблоны также обязательны для интервальных конструкторов и для интервальной формы assign (см. совет 5).

Оглавление книги


Генерация: 1.319. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз