
- •Учебное пособие
- •Введение
- •Объектно-ориентированный подход
- •Объектно-ориентированное программирование Абстрактные типы данных
- •Базовые принципы объектно-ориентированного программирования
- •Простейший ввод и вывод
- •Объект cout
- •Манипуляторы hex и oct
- •Другие манипуляторы
- •Объект cin
- •Операторы для динамического выделения и освобождения памяти (new и delete)
- •Базовые конструкции объектно-ориентированных программ Объекты
- •Понятие класса
- •Конструктор копирования
- •Конструктор explicit
- •Указатели на компоненты класса
- •Встроенные функции (спецификатор inline)
- •Организация внешнего доступа к локальным компонентам класса (спецификатор friend)
- •Вложенные классы
- •Static-члены (данные) класса
- •Указатель this
- •Компоненты-функции static и const
- •Proxi-классы
- •Параметры ссылки
- •Независимые ссылки
- •Практические приемы ограничения числа объектов класса
- •Наследование (производные классы)
- •Конструкторы и деструкторы при наследовании
- •Виртуальные функции
- •Абстрактные классы
- •Виртуальные деструкторы
- •Множественное наследование
- •Виртуальное наследование
- •Перегрузка функций
- •Перегрузка операторов
- •Перегрузка бинарного оператора
- •Перегрузка унарного оператора
- •Дружественная функция operator
- •Перегрузка оператора []
- •Перегрузка оператора ()
- •Перегрузка операторов new и delete
- •Преобразование типа
- •Явные преобразования типов
- •Преобразования типов, определенных в программе
- •Шаблоны Параметризированные классы
- •Передача в шаблон класса дополнительных параметров
- •Шаблоны функций
- •Совместное использование шаблонов и наследования
- •Шаблоны класса и friend
- •Некоторые примеры использования шаблона класса Реализация smart-указателя
- •Классы поддерживающие транзакции
- •Задание значений параметров класса по умолчанию
- •Пространства имен
- •Ключевое слово using как директива
- •Ключевое слово using как объявление
- •Псевдоним пространства имен
- •Организация ввода-вывода
- •Состояние потока
- •Строковые потоки
- •Организация работы с файлами
- •Организация файла последовательного доступа
- •Создание файла произвольного доступа
- •Основные функции классов ios, istream, ostream
- •Основы обработки исключительных ситуаций
- •Перенаправление исключительных ситуаций
- •Исключительная ситуация, генерируемая оператором new
- •Генерация исключений в конструкторах
- •Задание собственной функции завершения
- •Спецификации исключительных ситуаций
- •Задание собственного неожиданного обработчика
- •Иерархия исключений стандартной библиотеки
- •Стандартная библиотека шаблонов (stl) Общее понятие о контейнере
- •Общее понятие об итераторе
- •Категории итераторов
- •Основные итераторы
- •Вспомогательные итераторы
- •Операции с итераторами
- •Контейнерные классы Контейнеры последовательностей
- •Контейнер последовательностей vector
- •Контейнер последовательностей list
- •Контейнер последовательностей deque
- •Ассоциативные контейнеры
- •Ассоциативный контейнер multiset
- •Ассоциативный контейнер set
- •Ассоциативный контейнер multimap
- •Ассоциативный контейнер map
- •Адаптеры контейнеров
- •Адаптеры stack
- •Адаптеры queue
- •Адаптеры priority_queue
- •Пассивные и активные итераторы
- •Алгоритмы
- •Алгоритмы сортировки sort, partial_sort, sort_heap
- •Алгоритмы поиска find, find_if, find_end, binary_search
- •Алгоритмы fill, fill_n, generate и generate_n
- •Алгоритмы equal, mismatch и lexicographical_compare
- •Математические алгоритмы
- •Алгоритмы работы с множествами
- •Алгоритмы swap, iter_swap и swap_ranges
- •Алгоритмы copy, copy_backward, merge, unique и reverse
- •Примеры реализации контейнерных классов Связанные списки
- •Реализация односвязного списка
- •Реализация двусвязного списка
- •Реализация двоичного дерева
- •Литература
- •Вопросы по курсу ооп
- •220013, Минск, п.Бровки, 6.
Алгоритмы поиска find, find_if, find_end, binary_search
В STL имеется несколько алгоритмов, выполняющих поиск в контейнере. Приводимая ниже программа демонстрирует возможности этих алгоритмов.
#include <vector>
#include <iostream>
#include <algorithm>
#define T int
using namespace std;
bool fun(T i){return i%2==0;}
int main()
{ T m1[]={5,3,4,7,3,12};
std::vector<T> v1(m1,m1+sizeof(m1)/sizeof(T));
std::ostream_iterator<T> out(cout," ");
std::vector<T>::iterator itr;
cout<<"вектор v1 : ";
std::copy(v1.begin(),v1.end(),out);
itr=std::find(v1.begin(),v1.end(),5);
cout<<"\nзначение 5 ";
if(itr!=v1.end()) cout<<"найдено в позиции "<<itr-v1.begin()<<endl;
else cout<<"не найдено\n";
itr=std::find_if(v1.begin(),v1.end(),fun);
if(itr!=v1.end()) cout<<"первый четный элемент вектора v1["<<
itr-v1.begin()<<"]= "<<*itr<<endl;
else cout<<"четные элементы в векторе v1 отсутствуют\n";
// std::sort(v1.begin(),v1.end()); // необходимо выполнить
if(std::binary_search(v1.begin(),v1.end(),3)) // сортировку вектора
cout<<"число 3 найдено в векторе v1\n"; // для binary_search
else cout<<"число 3 не найдено в векторе v1\n";
return 0;
}
В приведенной программе использован алгоритм find, выполняющий поиск в векторе v1 значения 5.
itr=std::find(v1.begin(),v1.end(),5);
Далее в программе использована функция find_if нахождения первого значения вектора v, для которого унарная предикатная функция fun возвращает true:
itr=std::find_if(v1.begin(),v1.end(),fun);
Каждый из алгоритмов find и find_if возвращает итератор ввода на найденный элемент либо (если элемент не найден) итератор, равный v.end(). Аргументы find и find_if должны быть, по крайней мере, итераторами ввода.
В строке:
if(std::binary_search(v1.begin(),v1.end(),3))
для поиска значения 3 в векторе v1 использована функция binary_search. При этом последовательность элементов вектора в анализируемом диапазоне должна быть отсортирована в возрастающем порядке. Функция возвращает значение bool. В STD имеется вторая версия алгоритма binary_search, имеющая четвертый параметр, – бинарная предикатная функция, возвращающая true, если два сравниваемых элемента упорядочены.
Алгоритмы fill, fill_n, generate и generate_n
Алгоритмы данной группы предназначены для заполнения определенным значением некоторого диапазона элементов контейнера. При этом алгоритмы generate и generate_n используют порождающую функцию. Порождающая функция не принимает никаких аргументов и возвращает значение, заносимое в элемент контейнера.
Прототип функций fill, fill_n имеет вид:
template<class FwdIt, class T>
void fill(FwdIt first, FwdIt last, const T& x);
template<class OutIt, class Size, class T>
void fill_n(OutIt first, Size n, const T& x);
Пример программы, использующей алгоритм generate, приведен ниже.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// функция нахождения чисел Фибоначчи
int Fibonacci(void)
{ static int r;
static int f1 = 0;
static int f2 = 1;
r = f1 + f2 ;
f1 = f2 ;
f2 = r ;
return f1 ;
}
void main()
{ const int v_size = 8 ;
typedef vector<int > vect;
typedef vect::iterator vectIt ;
vect numb(v_size); // вектор, содержащий числа
vectIt start, end, it ;
start = numb.begin() ; // позиция первого элемента
end = numb.end() ; // позиция последнего эл-та
// заполнение [first, last +1) числами Фибоначчи
// используя функцию Fibonacci()
generate(start, end, Fibonacci) ;
cout << "numb { " ; // вывод содержимого
for(it = start; it != end; it++)
cout << *it << " " ;
cout << " }\n" << endl ;
}