Программирование >>  Операторы преобразования типа 

1 ... 34 35 36 [ 37 ] 38 39 40 ... 239


Если вы стремитесь обеспечить хорошее быстродействие, всегда используйте функции классов вместо алгоритмов. Есть только одна проблема - вы должны заранее знать, что некоторый контейнер содержит функцию, обладающую более i высоким быстродействием. При вызове алгоритма remove() не последует ни предупреждения, пи сообщения об ошибке. С другой стороны, если выбрать функцию, то при переходе на другой тип контейнера вам придется вносить изменения в программу. В справочнике алгоритмов (см. главу 9) указано, когда лучше использовать функцию классов, превосходящую алгоритм по быстродействию.

Унифицированные пользовательские функции

Библиотека STL имеет расширяемую архитектуру. Это означает, что программист может создавать собственные функции и алгоритмы для обработки коллекций. Конечно, такие операции тоже должны быть унифицированными, но при объявлении в них действительного итератора необходимо указывать тип контейнера. Чтобы упростить написание унифицированных функций, в каждом контейнерном классе присутствуют внутренние определения вспомогательных типов. Рассмотрим следующий пример:

st1/prlnt,hpp lincludG <1ostream>

/* PRINTJLEMENTSO

* - вывод необязательной строки С optcstr. после которой

* - выводятся все элементы коллекции coll.

* - разделенные пробелами. */

template <class Т>

inline void PRINT ELEMENTS (const T& coll, const char* optcstr= ) {

typename T::const iterator pos: std::C0ut Optcstr:

for (pos-coll,beginO; pos!=coll ,end(); ++pos) { std::cout *p0S ;

std::cout std::endl:

В этом примере определяется унифицированная функция для вывода необязательной строки, за которой выводятся все элементы переданного контейнера. В следующем объявлении переменная pos объявляется с типом итератора для контейнера переданного типа:

typename Т;:const itGrator pos:



Ключевое слово typename указывает, что const iterator - тип, а не значение типа Т (см. с. 27).

Помимо типов iterator и const iterator контейнеры предоставляют и другие типы, упрощающие написание унифицированных функций. В частности, они предоставляют тип элементов для выполнения операций с временными копиями элементов. За подробностями обращайтесь >ia с. 289.

Необязательный второй аргумент функции PRINT ELEIENTS представляет собой строковый префикс, выводимый перед содержимым контейнера. Так, функция PRINT ELEIENTS() позволяет снабжать выходные данные комментариями:

PRINTJLEMENTS (coll. ell elements: ):

Эта функция будет еще часто использоваться в книге для вывода всех элементов контейнера одной простой командой.

Передача функций алгоритмам в качестве аргументов

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

Примеры передачи функций в аргументах алгоритмов

Передачу функции проще всего рассматривать на примере алгоритма for each(), вызывающего пользовательскую функцию для каждого элемента в заданном интервале.

stl/foreach.cpp Iinclude <iostream> Iinclude <vector> Iinclude <algorith[ii> using namespace std;

Функция 8Ы80ДИТ передзнный аргумент

void print Cint elem)

cout elem ;

int mainO {

vector<int> coll:

Вставка элементов со значениями от 1 до 9 for (int i=l; i<=9: ++i) {



coll.push back(i

Вывод всех элементов

for each Ccoll.beginO. coll.endO. Интервал print): Операция

cout endl:

Алгоритм for each() вызывает функцию print() для каждого элемента в интервале [coll.beginQ,coll.endQ). Результат выполнения программы выглядит так:

1 2 3 4 5 6 7 8 9

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

Другой пример:

stl/transforml.срр Iinclude <iostream> Iinclude <vector> Iinclude <set> Iinclude <algor1thm> Iinclude print.hpp

int square (Int value) (

return valuG*value:

int main() (

std::set<int> colli; std::vector<int> Coll2;

Вставка элементов со значениями от 1 до 9 в colli for (int 1=1: i<=9; ++1) { colli.insertd);

PRINT ELEMENTS(C0l11. initialized: );

Преобразовоание каждого элемента при копировании из colli в со112 - square transformed values

std::transform (coll 1,beg1n().colli.end(), Источник std::back inserter(coll2), Приемник square): Операция

PRINTJLEMENTSCcol 12. squared: );



1 ... 34 35 36 [ 37 ] 38 39 40 ... 239

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