Курс ООП в С презентация. ООП в с++(полный курс). Объекты и классы
Скачать 1.76 Mb.
|
Контейнерные классы// программа считывает числа в вектор, сортирует по возрастанию и // выводит на экран: void main() { int n; cout << "n?"; cin >> n; vector int x; //заполнение вектора for(int i=0; i cout << "?"; cin >> x; v.push_back(x); //добавление в конец } sort(v.begin(), v.end()); //сортировка vector for (i = v.begin(); i != v.end(); ++i) cout << *I << " "; //печать вектора } Контейнерные классыАлгоритм sort имеет две сигнатуры:
void sort(RandomAccessIt first, RandomAccessIt last); - обеспечивает сортировку элементов из диапазона [first, last), причем для упорядочения по умолчанию используется операция <, которая должна быть определена для типа Т. Таким образом, сортировка по умолчанию – это сортировка по возрастанию значений. template void sort(RandomAccessIt first, RandomAccessIt last, Compare comp); – позволяет задать произвольный критерий упорядочения. Для этого нужно передать через третий аргумент соответствующий предикат, то есть функцию или функциональный объект, возвращающие значение типа bool. Функциональным объектом называется объект некоторого класса, для которого определена единственная операция вызова функции operator(). В стандартной библиотеке определены шаблоны функциональных объектов для операций сравнения, встроенных в язык C++ .они возвращают значение типа bool. Контейнерные классыШаблоны функциональных объектов для операций сравнения При подстановке в качестве аргумента алгоритма требуется инстанцирование этих шаблонов, например: equal_to Если заменить в предыдущей программе вызов функции sort на sort(v.begin(), v.end(), greater Если сортировка выполняется для контейнера с объектами пользовательского класса, то программисту нужно самому позаботиться о наличии в классе предиката, задающего сортировку по умолчанию, а также (при необходимости) определить функциональные классы, объекты которых позволяют изменять настройку алгоритма sort.
Контейнерные классыclass person { char name[20]; int age; public: //конструктор без параметров person(){name[0]='\0';age=0;} person( char[20],int ); //конструктор с параметрами //функция для ввода объекта из потока friend istream& operator>>(istream&,person&); //функця для вывода объекта в поток friend ostream& operator<<(ostream&,const person&); char* get_name(){return name;} //получить имя int get_age(){return age;} //получить возраст //перегрузка операции сравнения с константой типа int bool operator == (const int &x) {if (age==x) return true;return false;} Контейнерные классы//перегрузка операции < bool operator < (const person & x) {if (age < x.age) return true; else return false;} //перегрузка операции < bool operator < (const int & x) {if (age < x) return true; else return false;} //перегрузка операции > bool operator < (const person & x) {if (age < x.age) return true; else return false;} //перегрузка операции > bool operator > (const int & x) {if (age > x) return true; else return false;}; }; Контейнерные классы//функциональный класс для сортировки по возрастанию class Comp1 { public: bool operator()(person&p1,person&p2) { if(strcmp(p1.get_name(),p2.get_name())<0)return 1; else return 0; } }; //функциональный класс для сортировки по убыванию class Comp2 { public: bool operator()(person&p1,person&p2) { if(strcmp(p1.get_name(),p2.get_name())>0)return 1; else return 0; } |