Листинг 19.13. Алгоритм изменения последовательности
1: #include
2: #include
3: #include
4: using namespace std;
5:
6: template
7: class Print
8: {
9: public:
10: void operator()(const T& t)
11: {
12: cout << t << " ";
13: }
14: };
15:
16: int main()
17: {
18: Print DoPrint;
19: vector vInt(10);
20:
21: fill(vInt.begin(), vInt.begin()+5, 1);
22: fill(vInt.begin() + 5, vInt.end(), 2);
23:
24: for_each(vInt.begin(), vInt.end(), DoPrint);
25: cout << "\n\n";
26:
27: return 0;
28: }
Результат:1 1 1 1 1 2 2 2 2 2
Анализ:Единственная новая деталь в этом листинге содержится в строках 21 и 22, где используется алгоритм fill(). Алгоритм заполнения предназначен для заполнения элементов последовательности заданным значением. В строке 21 целое значение 1 присваивается первым пяти элементам в векторе vInt. А последним пяти элементам вектора vInt присваивается целое число 2 (в строке 22).
Сегодня вы узнали, как создавать и использовать шаблоны — встроенное средство языка C++, используемое для создания параметризованных типов, т.е. типов, которые изменяют свое выполнение в зависимости от параметров, переданных при создании класса. Таким образом, шаблоны - это возможность многократного использования программного кода, причем безопасным и эффективным способом,
В определении шаблона устанавливается параметризованный тип, Каждый экземпляр шаблона — это реальный объект, который можно использовать подобно любому другому объекту: в качестве параметра функции, возвращаемого значения и т.д.
Классы шаблонов могут объявлять три типа функций-друзей: не относящихся к шаблону, шаблонных и специализированных по типу. В шаблоне можно объявлять статические члены. Тогда каждый экземпляр шаблона будет иметь собственный набор статических данных.
Если нужно специализировать выполнение функции шаблона в зависимости от типа, то ее можно замещать для разных типов.
Чем использование шаблонов лучше использования макросов?
Шаблоны обеспечивают более безопасное использование разных типов и встроены в язык.
Какова разница между параметризованным типом функции шаблона и параметрами обычной функции?
Обычная функция (не шаблонная) принимает параметры, с которыми может выполнять заданные действия. Функция шаблона позволяет с помощью параметра шаблона устанавливать тип передаваемого параметра функции. Так, в функцию можно передать массив объектов, тип которых будет уникален для разных экземпляров шаблона.
Когда следует использовать шаблоны, а когда наследование?
Используйте шаблоны в том случае, когда все или почти все выполнение класса остается неизменным, а изменяется только тип данных, используемых в классе.
Когда использовать дружественные шаблонные классы и функции?
Когда каждый экземпляр, независимо от типа, должен быть другом по отношению к этому классу или функции.
Когда использовать дружественные шаблонные классы или функции, специализированные по типу?
Когда между двумя классами нужно установить отношения по типу один-к-одному. Например, массив array должен соответствовать итератору iterator, но не iterator.
Каковы два типа стандартных контейнеров?
Последовательные и ассоциативные контейнеры. Последовательные контейнеры обеспечивают оптимизированный последовательный и произвольный доступ к своим элементам. Ассоциативные контейнеры обеспечивают оптимизированный доступ к элементам на основе ключевых значений.
Какими атрибутами должен обладать класс, чтобы его можно было использовать со стандартными контейнерами?
В классе должны быть явно определены стандартный конструктор, конструктор- копировщик и перегруженный оператор присваивания.
В этом разделе предлагаются вопросы для самоконтроля и укрепления полученных знаний, а также ряд упражнений, которые помогут закрепить ваши практические навыки. Попытайтесь самостоятельно ответить на вопросы теста и выполнить задания, а потом сверьте полученные результаты с ответами в приложении Г. Не приступайте к изучению материала следующей главы, если для вас остались неясными хотя бы некоторые из предложенных ниже вопросов.
1. Какова разница между шаблоном и макросом?
2. В чем состоит отличие параметра шаблона от параметра функции?
3. Чем отличается обычный дружественный шаблонный класс от дружественного шаблонного класса, специализированного по типу?
4. Можно ли обеспечить особое выполнение для определенного экземпляра шаблона?
Читать дальше