Скотт Мейерс - Эффективное использование STL
Название: | Эффективное использование STL | |
Автор: | Скотт Мейерс | |
Жанр: | Современные российские издания, Литература ХXI века (эпоха Глобализации экономики), Программирование: прочее, C, C++, C# | |
Изадано в серии: | Библиотека программиста | |
Издательство: | Питер | |
Год издания: | 2002 | |
ISBN: | 5-94723-382-7 | |
Отзывы: | Комментировать | |
Рейтинг: | ||
Поделись книгой с друзьями! Помощь сайту: донат на оплату сервера |
Краткое содержание книги "Эффективное использование STL"
В этой книге известный автор Скотт Мейерс раскрывает секреты настоящих мастеров, позволяющие добиться максимальной эффективности при работе с библиотекой STL.
Во многих книгах описываются возможности STL, но только в этой рассказано о том, как работать с этой библиотекой. Каждый из 50 советов книги подкреплен анализом и убедительными примерами, поэтому читатель не только узнает, как решать ту или иную задачу, но и когда следует выбирать то или иное решение — и почему именно такое.
К этой книге применимы такие ключевые слова (теги) как: Programming STL C++
Читаем онлайн "Эффективное использование STL". [Страница - 119]
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).
MSVC версий 4-6
К сожалению, в реализации STL, входящей в комплект поставки версий 4-6, шаблоны функций не объявляются. Библиотека изначально разрабатывалась для MSVC версии 4, а этот компилятор, как и большинство компиляторов того времени, не обладал поддержкой шаблонов функций классов. При переходе от MSCV4 к MSVC6 поддержка этих шаблонов была включена в компилятор, но вследствие судебных дел, косвенно затрагивавших фирму Microsoft, библиотека оставалась практически в неизменном состоянии.Поскольку реализация STL, поставляемая с MSVC4-6, предназначалась для компилятора без поддержки шаблонов функций классов, авторы библиотеки имитировали эти шаблоны и заменили их конкретными функциями, которым при вызове передавались итераторы контейнера соответствующего типа. Например, шаблон insert был заменен следующей функцией:
void insert(iterator position, // "iterator" - тип итератора
iterator first, iterator last); // для конкретного контейнера
Эта ограниченная форма интервальных функций позволяла выполнить интервальную вставку из vector<Widget> в vector<Widget> или из list<int> в list<int>, но смешанные операции (например, вставка из vector<Widget> в list<Widget> или из set<int> в deque<int>) не поддерживались. Более того, не поддерживалась даже интервальная вставка (а также конструирование или assign) из vector<long> в vector<int>, поскольку итераторы vector<long>::iterator и vector<int>::iterator относятся к разным типам. В результате следующий фрагмент, принимаемый другими компиляторами, не компилируется в MSVC4-6:
istream_iterator<Widget> begin(cin), end; // Создать итераторы begin и end
// для чтения объектов Widget
// из cin (см. совет 6).
vector<Widget> vw(begin, end); // Прочитать объекты Widget
// из cin в vw (см. совет 6)
// не компилируется в MSVC4-6!
list<Widget> lw;
lw.assign(vw.rbegin(), vw.rend()); // Присвоить lw содержимое vw
// (в обратном порядке);
// не компилируется в MSVC4-6!
SpeciаlContainer<Widget> scw;
scw.insert(scw.end(), lw.begin(), lw.end()); // Вставить в конец scw
// копию объектов Widget из lw;
// не компилируется в MSVC4-6!
Так что же делать, если вы работаете в среде MSVC4-6? Это зависит от используемой версии MSVC и того, вынуждены ли вы использовать реализацию STL, поставляемую вместе с компилятором.
Обходное решение для MSVC4-5
Еще раз посмотрим на правильный код, который не компилируется для реализации STL из поставки MSVC4-6:vector<Widget> vw(begin, end); // Отвергается реализацией STL
// из поставки --">Книги схожие с «Эффективное использование STL» по жанру, серии, автору или названию:
Сергей Михайлович Плешаков - Использование химических ловушек в борьбе с преступностью Жанр: Технические науки Год издания: 2008 |
Стивен Холзнер - XSLT Жанр: Программирование: прочее Год издания: 2002 Серия: Библиотека программиста |
Эндрю Хант, Дэвид Томас - Программист-прагматик. Путь от подмастерья к мастеру Жанр: Программирование: прочее Год издания: 2004 Серия: Библиотека программиста |
Сергей Тарасов - Дефрагментация мозга. Софтостроение изнутри Жанр: Программирование: прочее Год издания: 2013 Серия: Библиотека программиста |
Другие книги из серии «Библиотека программиста»:
Дж. Ханк Рейнвотер - Как пасти котов. Наставление для программистов, руководящих другими программистами Жанр: Другие языки и системы программирования Год издания: 2006 Серия: Библиотека программиста |
Гэбриел Гамбетта - Компьютерная графика. Рейтрейсинг и растеризация. Жанр: Программирование графики Год издания: 2022 Серия: Библиотека программиста |
Бен Фрэйн - Отзывчивый дизайн на HTML5 и CSS3 для любых устройств Жанр: Web-дизайн Год издания: 2022 Серия: Библиотека программиста |
Франсуа Шолле - Глубокое обучение на Python Жанр: Python Год издания: 2023 Серия: Библиотека программиста |