Книга: Эффективное использование 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).
- Замечания по поводу платформ STL от Microsoft
- Часть III. Шаблоны разработки через тестирование
- Пересмотр функций клиента
- Вызовы функций
- 9.1.6.1. Использование функций POSIX: wait() и waitpid()
- 9.7.4. Иерархии классов и абстрактные классы
- lastlog
- Листинг 12.1. Результат выполнения команды lastlog
- Шаблоны
- Урок 6.4. Расчеты с использованием функций и имен ячеек
- Мастер функций
- Практическая работа 46. Выполнение расчетов с использованием Мастера функций