Программирование >>  Дополнительные возможности наследования 

1 ... 204 205 206 [ 207 ] 208 209 210 ... 265


Операции, не изменяющие иоследовательность

Операции, не изменяющие последовательность данных в структуре, реализуются с помощью таких функций, как for each() и findO, search(), count() и т.д. В листинге 19.12 показан пример использования обьекта функции и алгоритм for each, предназначенный для печати элементов вектора.

йншш 13.1Z. Нснользование алгоритма f Оrach()

2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

ftinclude <iostream> ftinclude <vector> ftinclude <algorithm> using namespace std;

template<class T>

class Print

public:

void operator()(const T& t) {

cout t ;

int mainO {

Print<int> DoPrint; vector<int> vlnt(5);

for (int 1=0; i < 5; ++i) vlnt[i] =1.3;

cout << for each()\ n ;

for each(vInt.begin(), vlnt.end(), DoPrint);

cout << Л n ;

return 0;

for each() 0 3 6 9 12

Обратите внимание, что все стандартные алгоритмы С++ определены в файле заголовка <algorithm>, поэтому следует включить его в нашу профамму. Большая часть профаммы не должна вызывать никаких фудностей. В сфоке 25 вызывается функция for each(), чтобы опросить каждый элемент в векторе vInt. Для каждого элемента она вызывает объект функции DoPrint и передает этот элемент оператору DoPrint. operator(), что приводит к выводу на экран значения данного элемента.



Под изменением последовательности понимают изменение порядка элементов в структуре данных. Изменять последовательность способны операции, связанные с заполнением или переупорядочением коллекций. Алгоритм заполнения показан в листинге 19.13.

ЛИЕШИНВ 18.13. ДАВОРИШМ 118мв11ви1111 ИВЕАВуВВаШВДЬНВСПИ!

1: Sinclude <iostream> 2: sinclude <veotor> 3; #lnclude <algorlthm> 4; using namespace std; 5;

6; template<class T> 7: class Print 8: { 9: public:

10: void operator()(const T& t)

11: {

12: cout t ;

13; }

14: } ; 15:

16; int mainO 17: {

18; Print<int> DoPrint;

19; vector<int> vlnt(IO);

21; filKvInt.beglnO, vlnt.begin() + 5, 1);

22; fill(vlnt.begin() + 5, vlnt.end(), 2);

24; for each(vInt. begin(), vInt.endO, DoPrint);

25: cout X n\ n ;

27; return 0;

28: }

1 1 1 1 1 2 2 2 2 2

t . Единственная новая деталь в этом листинге содержится в строках 21 и 22,

* где используется алгоритм fill(). Алгоритм заполнения предназначен для

заполнения элементов последовательности заданным значением. В строке 21 целое значение 1 присваивается первым пяти элементам в векторе vInt. А последним пяти элементам вектора vInt присваивается целое число 2 (в строке 22).

591184



Резюме

Сегодня вы узнали, как создавать и использовать шаблоны - встроенное средство языка С++, используемое для создания параметризованных типов, т.е. типов, которые изменяют свое выполнение в зависимости от параметров, переданных при создании класса, Таким образом, шаблоны - это возможность многократного использования профаммного кода, причем безопасным и эффективным способом.

В определении шаблона устанавливается параметризованный тип, Каждый экземпляр шаблона - это реальный объект, который можно использовать подобно любому другому объекту; в качестве параметра функции, возвращаемого значения и т.д,

Классы шаблонов могут объявлять три типа функций-друзей: не относящихся к шаблону, шаблонных и специализированных по типу, В шаблоне можно объявлять статические члены. Тогда каждый экземпляр шаблона будет иметь собственный набор статических данных,

Если нужно специализировать выполнение функции шаблона в зависимости от типа, то ее можно замещать для разных типов.

Вопросы U ответы

Чем использование шаблонов лучше использования макросов?

Шаблоны обеспечивают более безопасное использование разных типов и встроены в язык.

Какова разница между параметризованным типом функции шаблона и параметрами обычной функции?

Обычная функция (не шаблонная) принимает параметры, с которыми может выполнять заданные действия. Функция шаблона позволяет с помошью параметра шаблона устанавливать тип передаваемого параметра функции. Так, в функцию можно передать массив объектов, тип которых будет уникален для разных экземпляров шаблона.

Когда следует использовать шаблоны, а когда наследование?

Используйте шаблоны в том случае, когда все или почти все выполнение класса остается неизменным, а изменяется только тип данных, используемых в классе.

Когда использовать дружественные шаблонные классы и функции?

Когда каждый экземпляр, независимо от типа, должен быть другом по отношению к этому классу или функции.

Когда использовать дружественные шаблонные классы или функции, специализированные по типу?

Когда между двумя классами нужно установить отношения по типу один-к-одному. Например, массив array<lnt> должен соответствовать итератору iterator<lnt>, но не iterator<Anlmal>.

Каковы два типа стандартных контейнеров?

Последовательные и ассоциативные контейнеры. Последовательные контейнеры обеспечивают оптимизированный последовательный и произвольный доступ к своим элементам. Ассоциативные контейнеры обеспечивают оптимизированный доступ к элементам на основе ключевых значений.



1 ... 204 205 206 [ 207 ] 208 209 210 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика