Функциональные объекты


Функциональные объекты — это объекты, у которых задан перегруженный оператор вызова функции "operator ()()". Все операторы обычно пишутся как inline, что дает дополнительный выигрыш в скорости.

Функциональными объектами являются все арифметические операторы: сложения (plus), вычитания (addition), умножения (times), деления (divides), взятия остатка (modulus) и обращения знака (negate). Имеются функциональные объекты для вычисления равенства (equal_to), неравенства (not_equal_to), операции "больше" (greater), операции "меньше" (less), операции "больше или равно" (greater_equal), операции "меньше или равно" (less_equal). Для логических операторов имеются свои функциональные объекты: логическое "и" (logical_and), логическое "или" (logical_or) и логическое "не" (logical_not).

Пример. Работа с контейнером vector

Определяем пустой вектор:

vector< int > arr;

Затем добавляем к нему элементы при помощи различных функций. Например, функция push_back()вставляет элемент в конец вектора. Вот фрагмент кода, считывающего последовательность чисел и добавляющего их в вектор:

int i;for (i=1; i<9; i++) { arr.push_back(i); // ...}

Хотя мы можем использовать операцию взятия индекса для перебора элементов вектора:

cout << "считаны числа: \n";for ( int ix =0; ix < arr.size(); ++ix ) cout << arr [ ix ] << ' ';cout << endl;

удобнее использовать итераторы:

cout << "считаны числа: \n";for ( vector<int>::iterator it = arr.begin(); it != arr.end(); ++it ) cout << *it << ' ';cout << endl;

Итератор — это класс стандартной библиотеки, фактически являющийся указателем на элемент массива.

Выражение

*it;

разыменовывает итератор и дает сам элемент вектора. Инструкция

++it;

сдвигает указатель на следующий элемент. Не нужно смешивать эти два подхода. Если следовать идиоме STL при определении пустого вектора:

vector<int> ivec;

будет ошибкой написать:

ivec[0] = 1024;

У нас еще нет ни одного элемента вектора ivec; количество элементов выясняется с помощью функции size().

Можно допустить и противоположную ошибку. Если мы определили вектор некоторого размера, например:

vector<int> ia( 10 );

то вставка элементов увеличивает его размер, добавляя новые элементы к существующим. Хотя это и кажется очевидным, тем не менее, начинающий программист вполне мог бы написать:

const int size = 7;int ia[ size ] = { 0, 1, 1, 2, 3, 5, 8 };vector< int > ivec( size );for ( int ix = 0; ix < size; ++ix ) ivec.push_back( ia[ ix ] );

Имелась в виду инициализация вектора ivec значениями элементов ia, вместо чего получился вектор ivec размера 14.



Дата добавления: 2016-07-27; просмотров: 1599;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.008 сек.