1.5 Function Object.
a, Khái niêm:
Một function object (đối tượng hàm) là một object (đối tượng) được sử dụng như một function (hàm). Gọi function object nghĩa là chúng ta đang gọi đến operator() của nó. Viết một function object nghĩa là viết operator() cho một lớp. Các function object là các object, bởi vậy chúng có trạng thái, còn các hàm bình thường thì không, do đó, chúng có thể ứng xử khác nhau tùy vào trạng thái – và điều đó tạo nên sự linh hoạt.
1. Tìm hiểu về thư viện STL. 1.5 Function Object. 1.5 Function Object.
Vậy function object là một instance của một lớp mà lớp đó phải có ít nhất một hàm thỏa:
quyền truy xuất phải là public.
phải là một hàm thành viên, không phải là một hàm friend.
không phải là một hàm static.
1. Tìm hiểu về thư viện STL. 1.5 Function Object. 1.5 Function Object.
b, Phân loại:
Generator: Một loại functor hoặc function không có đối số và trả về value_type ví dụ hàm rand() trong <stdlib> và một số thuật toán chẳng hạn như generate_n() - sinh một chuỗi.
Unary: Một loại functor hoặc function dùng một đối số duy nhất của value_type và trả về một giá trị mà có thể không phải value_type ( void chẳng hạn).
Binary: Một loại functor hoặc function nhận hai đối số của hai kiểu bất kỳ và trả về giá trị nào đó.
1. Tìm hiểu về thư viện STL. 1.5 Function Object. 1.5 Function Object.
Unary Predicate: Một unary operation trả lại giá trị bool.
Binary Predicate: Một binary operation trả lại giá trị bool.
Ngoài ra, ta cón phân loại dựa trên tính chất object của functor:
LessThanComparable: Một functor có định nghĩa ít nhất một toán tử <.
Assignable: Một functor có định nghiã toán tử gán ( = )
EqualityComparable: Một functor có định nghĩa toán tử so sánh tương đương ==.
1. Tìm hiểu về thư viện STL. 1.5 Function Object. 1.5 Function Object.
C, Thư viện functional
Khai báo: #include <functional>
Các hàm toán học cơ bản của thư viện functional: Bao gồm cộng (plus) trừ (minus) nhân (multiplies) chia
2. Bài tập.
Viết chương trình nhập vào một danh sách n sinh viên, mỗi sinh viên có các thông tin về họ tên, lớp, điểm TBC. Tìm sinh viên có tên nhập vào từ bàn phím. Yêu cầu trong chương trình có sử dụng container list để chứa các đối tượng sinh viên, algorithms find_if và đối tượng hàm tự tạo để tìm kiếm.
#include <iostream> #include <list> #include <algorithm> #include <functional> #include<conio.h> #include<string> #include<functional> using namespace std;
// Khai bao lop SV class SV { public: char lop[15]; float dtb; string hoten; public: void nhap(); void hien(); void timkiem(); };
class comp_student:public binary_function<SV,string, bool> {
public: {
bool operator()( const SV& abc, const string &name ) const {
return (abc.hoten == name); }
};
//=======CHUONG TRINH CHINH=========int main() int main() { int i,n; SV sv1[10]; timkiem TK; list<SV> SVlist; list<SV>::iterator it1;
cout<<"\n\t==CHUONG TRINH QUAN LY SINH VIEN=="<<endl<<endl; cout<<"\t\tNhap tong so sinh vien: ";cin>>n;
//Nhap danh sanh sinh vien
cout<<"\tNhap thong tin chi tiet cua tung sinh vien"<<endl; for(i=0;i<n;i++)
{
cout<<"Nhap danh sach sinh vien thu "<<i+1<<":"; cin.ignore(1);
sv1[i].nhap();
SVlist.push_back(sv1[i]); }
//Hien danh sach sinh vien
cout<<"Danh sach sinh vien vua nhap:"<<endl; i=0; for(it1=SVlist.begin();it1!=SVlist.end();it1++) { i++; (*it1).hien(); } string y;
cout<<"\nNhap vao ten sinh vien can tim"; cin>>y;
cin.get();
list<SV>::iterator abc;
abc = find_if( SVlist.begin(), SVlist.end(),bind2nd(TK.comp_studen(), y ) ); cout<<"\nKET QUA TIM KIEM\n";
if (abc==SVlist.end())
cout<<"\nKhong tim thay sv nao "; while(abc!=SVlist.end())
{
cout << "\nDa Tim Thay sv "<< endl; (*abc).hien(); abc++; } char getch(); return 0; }
//Dinh nghia lop SV void SV::nhap() {
cout<<"\tHo ten: ";cin>>hoten;cin.ignore(1); cout<<"\tLop: ";cin.get(lop,15);cin.ignore(1); cout<<"\tDiem trung binh cong:";
cin>>dtb; } //--- void SV::hien() { cout<<lop<<hoten<<dtb; }