Tải bản đầy đủ (.doc) (21 trang)

BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Tìm hiểu về thư viên STL

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (162.37 KB, 21 trang )

Nhóm 31_TinC52
TRƯỜNG ĐẠI HỌC NÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
*****
BÁO CÁO BÀI TẬP LỚN
MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Gv hướng dẫn : Ngô Công Thắng
Lớp : THC-K52
Nhóm : 31
Đề tài số : 08
Nhóm sv thực hiện: Đỗ Thị Ngọc Bích
Hoàng Thị Hoa
Nguyễn Thị Ngọc Huyên
Nguyễn Thị Thảo
Nguyễn Thị Xuân
Hà Nội, 2010
1
Nhóm 31_TinC52
Đề tài số 8 :
Tìm hiểu về thư viện STL: Tổng quan về STL, Algorithms, Iterators
và Function Object. 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.
Phân chia công việc các thành viên trong nhóm:
1. Gíơi thiệu về STL (Standard Template Library) và các giải thuật (Algorithm).
Nguyễn Thị Thảo và Nguyễn Thị Xuân
2. Tìm hiểu về các côngtenơ (container) và các con trỏ (iterator).
Đỗ Thị Ngọc Bích và Nguyễn Thị Ngọc Huyên.
3. Tìm hiểu về Function Object.


Hoàng Thị Hoa
4. Chương trình: Nhóm
2
Nhóm 31_TinC52
Mục lục
Lời giới thiệu
Nội dung
A. Lý thuyết (Standard Template Library).
I. Giơí thiệu về thư viện STL (Standard Template Library)…… 5
II. Các côngtenơ (container).………… …………………………6
1. Côngtenơ tuần tự.
2. Côngtenơ liên kết.
3. Hàm thành viên.
4. Kiểu dữ liệu trừu tượng.
III. Các giải thuật (Algorithm)…………….…………………….11
IV. Con trỏ (iterator)….…………………………………… ….13
V. Function Object…………………………………. ………… 15
1. Khái niệm.
2. Phân loại.
3. Sử dụng Function Object.
4. Thư viện Functonal.
B. Lập trình………………………………………………………… 17
Kết luận
Tài liệu tham khảo…………………………………………………… 21
3
Nhóm 31_TinC52
Lời giới thiệu
C++ được đánh giá là ngôn ngữ mạnh vì tính mềm dẻo, gần gũi với ngôn
ngữ máy. Ngoài ra, với khả năng lập trình theo mẫu ( template ), C++ đã khiến
ngôn ngữ lập trình trở thành khái quát, không cụ thể và chi tiết như nhiều ngôn

ngữ khác. Sức mạnh của C++ đến từ STL, viết tắt của Standard Template
Library - một thư viện mẫu chuẩn cho C++ với những cấu trúc dữ liệu cũng như
giải thuật được xây dựng tổng quát mà vẫn tận dụng được hiệu năng và tốc độ
của C. Với khái niệm mẫu chuẩn ( template ), những người lập trình đã đề ra
khái niệm lập trình khái lược, C++ được cung cấp kèm với bộ thư viện chuẩn
STL.
Trong phạm vi bài báo cáo này nhóm thực hiện xin giới thiệu về thư viện
chuẩn STL với việc tìm hiểu các côngteno (contai ner), các giải thuật
(Algorithm), các iterator (con trỏ), Function Object của thư viện.
Trong quá trình tìm hiểu, tuy đã hết sức cố gắng tìm hiểu nhưng không thể
tránh khỏi những sai sót. Mong thầy giáo và các bạn bổ sung thêm.
Xin chân thành cám ơn.

Nhóm thực hiện
4
Nhóm 31_TinC52
A. Lý thuyết.
I. Giới thiệu về thư viện STL (Standard Template Library).
STL,viết tắt của Standard Template Library là một thư viện mẫu chuẩn
cho C++ được phát triển vào năm 1992, với mong muốn có được những cấu
trúc dữ liệu cũng như giải thuật tổng quát nhất nhưng không làm mất đi tính
hiệu quả. Thư viện này được đưa vào danh sách các thư viện chuẩn của C++
theo tiêu chuẩn ANSI/ISO với tên gọi Standard Template Library (STL).
STL đã được nhiều tổ chức, hãng phần mềm mở rộng và phát triển. Trong
đó đáng kể nhất phải kể đến phiên bản SGI_STL của Silicon Graphics và STL
Port (hiện đã được tích hợp trong Borland C++ Builed 6).
Đặc điểm thư viện STL này là được hỗ trợ trên các trình biên dịch ở cả
hai môi trường WINDOWS lẫn UNIX. Vì vậy nên khi sử dụng thư viện này
trong xử lý thuận tiện cho việc chia sẻ mã nguồn với cộng đồng phát triển.
STL gồm các thành phần chính:

- Container (các bộ lưu trữ dữ liệu) là các cấu trúc dữ liệu phổ biến đã
template hóa dùng để lưu trữ các kiểu dữ liệu khác nhau. Các container chia làm
2 loại:
+ Sequential container (các ctdl tuần tự) bao gồm list, vector và
deque
+ Asociative container (các ctdl liên kết) bao gồm map, multimap,
set và multiset.
- Iterator (biến lặp) giống như con trỏ, tích hợp bên trong container.
- Algorithm (các thuật toán ) là các hàm phổ biến để làm việc với các bộ
lưu trữ như thêm, xóa, sửa, truy xuất,tìm kiếm, sắp xếp
- Function object (functor): Một kiểu đối tượng có thể gọi như 1 hàm,
đúng ra đây là 1 kỹ thuật nhưng trong STL nó được nâng cao và kết hợp với các
algorithm.
- Các adapter (bộ tương thích) , chia làm 3 loại:
5
Nhóm 31_TinC52
+ container adapter (các bộ tương thích lưu trữ) bao gồm stack,
queue và priority_queue.
+ iterator adapter (các bộ tương thích con trỏ).
+ function adapter (các bộ tương thích hàm).
Những thành phần này làm việc chung với các thành phần khác để cung
cấp các giải pháp cho các vấn đề khác nhau của chương trình.
Bộ thư viện này thực hiện toàn bộ các công việc vào ra dữ liệu
(iostream), quản lý mảng (vector), thực hiện hầu hết các tính năng của các cấu
trúc dữ liệu cơ bản (stack, queue, map, set ). Ngoài ra, STL còn bao gồm các
thuật toán cơ bản: tìm min, max, tính tổng, sắp xếp (với nhiều thuật toán khác
nhau), thay thế các phần tử, tìm kiếm (tìm kiếm thường và tìm kiếm nhị phân),
trộn. Toàn bộ các tính năng nêu trên đều được cung cấp dưới dạng template nên
việc lập trình luôn thể hiện tính khái quát hóa cao. Nhờ vậy, STL làm cho ngôn
ngữ C++ trở nên trong sáng hơn nhiều.

Đặc điểm thư viện STL là được hỗ trợ trên các trình biên dịch ở cả hai
môi trường WINDOWS lẫn UNIX, vì vậy nên khi sử dụng thư viện này trong
xử lý thuận tiện cho việc chia sẽ mã nguồn với cộng đồng phát triển.Vì thư viện
chuẩn được thiết kế bởi những chuyện gia hàng đầu và đã được chứng minh tính
hiệu quả trong lịch sử tồn tại của nó, các thành phần của thư viện này được
khuyến cáo sử dụng thay vì dùng những phần viết tay bên ngoài hay những
phương tiện cấp thấp khác. Thí dụ, dùng std::vector hay std::string thay vì dùng
kiểu mảng đơn thuần là một cách hữu hiệu để viết phần mềm được an toàn và
linh hoạt hơn.
Các chức năng của thư viện chuẩn C++ được khai báo trong
namespace std;
II. Các côngtenơ (container).
Côngtenơ là một cách lưu trữ dữ liệu, bao gồm cả dữ liệu có sẵn như int,
float và các đối tượng lớp. STL có 7 loại containers cơ bản. Các containers STL
chia làm 2 loại: container tuần tự (vector, list, deque) và container liên kết (set,
6
Nhóm 31_TinC52
multiset, map, multimap). Ngoài ra có một vài container gọi là các kiểu dữ liệu
trừu tượng, chúng là các dạng đặc biệt của các container khác (stack, queue,
priority queue).
1. Côngtenơ tuần tự.
Một côngtenơ tuần tự (sequencial container) lưu trữ một tập hợp các phần tử
mà có thể hình dung như một đường thẳng, như các nhà trên mặt phố. Mỗi phần
tử liên kết với một phần tử khác bằng vị trí của nó theo đường thẳng. Mỗi phần
tử (trừ phần tử cuối cùng) đều có một phần tử xác định đứng trước và đứng sau
nó. Một mảng C++ là một ví dụ về một côngtenơ tuần tự.
Các côngtenơ tuần tự cơ bản:
Côngtenơ Đặc điểm Những thuận lợi và không thuận lợi
Mảng C++
thông

thường
Kích thước cố định
+ Truy nhập ngẫu nhiên nhanh (qua chỉ số
mảng)
+ Chèn và xóa các phần tử ở giữa chậm
+ Kích thước không thay đổi tại thời điểm
chạy chương trình
Vector Tái định vị, mảng
có thể mở rộng
được, tương tự như
mảng 1 chiều
+ Truy nhập ngẫu nhiên nhanh (qua chỉ số)
+ Chèn và xóa các phần tử ở giữa chậm
+ Chèn và xóa các phần tử ở cuối nhanh
List Danh sách liên kết
kép
+ Chèn và xóa các phần tử ở bất kì vị trí nào
nhanh
+ Truy nhập nhanh tới cả hai đầu
+ Truy nhập ngẫu nhiên chậm
Deque Là một biến dạng
của một vector, nó
trợ giúp truy nhập
ngẫu nhiên dùng
toán tử []. Tuy
nhiên không giống
như một vector mà
giống một danh
sách, một hàng đợi
2 đầu có thể truy

nhập cả trước và
sau
+ Truy nhập ngẫu nhiên nhanh (dùng chỉ số)
+ Chèn và xóa các phần tử ở giữa chậm
+ Chèn và xóa các phần tử ở đầu hoặc ở cuối
nhanh
7
Nhóm 31_TinC52
Việc tạo một đối tượng côngtenơ rất dễ. Đầu tiên phải có một file tiêu đề
thích hợp. Sau đó sử dụng dạng mẫu với tham số là loại đối tượng cần lưu trữ.
Ví dụ: vetro<int> avact //tạo một vecto các số nguyên
Hoặc: list<airtime> departure_list; //tạo một danh sách các đối tượng airtime
Chú ý: không cần xác định kích thước cho côngtenơ. Các côngtenơ tự chúng
quan tâm tới tất cả việc cấp phát bộ nhớ.
2. Côngtenơ liên kết.
Một côngtenơ liên kết là một côngtenơ không tuần tự, thay vào đó sử
dụng các khóa để truy nhập dữ liệu. Các khóa, điển hình là các số hoạc các
chuỗi, được sử dụng tự động bởi côngtenơ để sắp xếp các phần tử để lưu trữ
theo một trật tự nhất định. Nó giống như một quyển từ điển tiếng Anh mà ở đó
chúng ta có thể truy nhập dữ liệu bằng cách tra các từ đã được sắp xếp theo thứ
tự alphabe. Nếu bắt đầu với một giá trị khóa, chẳng hạn như “aardvark”, thì
côngtenơ sẽ chuyển khóa này tới vị trí của phần tử trong bộ nhớ. Nếu biết khóa
thì chúng ta có thể nhanh chóng truy nhập tới giá trị liên kết.
Có hai loại côngtenơ liên kết trong STL: ánh xạ (map) và tập hợp (set).
Một ánh xạ liên kết một khóa (ví dụ từ mà chúng ta muốn tra) với một giá trị (ví
dụ như định nghĩa của từ). Giá trị có thể là bất kì loại đối tượng nào. Một tập
hợp (set) tương tự như một ánh xạ (map) nhưng nó chỉ lưu trữ các khóa, không
có các giá trị liên kết. Nó giống như một danh sách các từ không có định nghĩa.
Các côngtenơ ánh xạ và tập hợp chỉ lưu trữ duy nhất một khóa cho một
giá trị. Điều này giống như một danh bạ điện thoại, ở đó mỗi người chỉ có duy

nhất một số điện thoại. Trái lại, các côngtenơ đa ánh xạ (multimap) và đa tập
hợp (multiset) cho phép có nhiều khóa. Ví dụ, trong một quyển từ điển tiếng
Anh có thể có vài mục cho từ “set”.


8
Nhóm 31_TinC52
Các côngtenơ liên kết cơ bản:
Côngtenơ Đặc điểm Những thuận lợi và không thuận lợi
Map
+ Liên kết khóa
với phần tử
+ Chỉ cho phép
duy nhất một khóa
cho mỗi giá trị
+ Truy nhập ngẫu nhiên nhanh (bằng
khóa)
+ Không hiệu suất nếu các khóa không
được phân bố đều
Multimap
+ Liên kết khóa
với phần tử
+ Cho phép nhiều
giá trị khóa
+ Truy nhập ngẫu nhiên nhanh (bằng
khóa)
+ Không hiệu suất nếu các khóa không
được phân bố đều
Set
+ Chỉ lưu trữ các

khóa
+ Chỉ cho phép
một khóa duy nhất
với mỗi giá trị
+ Truy nhập ngẫu nhiên nhanh (bằng
khóa)
+ Không hiệu suất nếu các khóa không
được phân bổ đều
Multiset
+ Chỉ lưu trữ các
khóa
+ Cho phép nhiều
giá trị khóa
+ Truy nhập ngẫu nhiên nhanh (bằng
khóa)
+ Không hiệu suất nếu các khóa không
được phân bổ đều

Tạo các côngtenơ liên kết y như tạo các côngtenơ tuần tự:
Map<int> IntMap; //tạo một ánh xạ các số nguyên
Hoặc: Multiset<emloyee> machinists; //tạo một đa tập hợp các đối
tượng employee
3. Hàm thành viên.
Các giải thuật (algorithm) thực hiện các công việc phức tạp như sắp xếp
và tìm kiếm . Tuy nhiên, các côngtenơ cũng cần các thành viên để thực hiện
những nhiệm vụ đơn giản hơn mà chỉ dành riêng cho một côngtenơ cụ thể.
Một vài hàm thành viên chung cho tất cả các côngtenơ.
Tên Chức năng
Size() Trả về số mục trong côngtenơ
Empty() Trả về true nếu côngtenơ rỗng

Max_size() Trả về kích thước lớn nhất có thể có
của côngtenơ
9
Nhóm 31_TinC52
Begin() Trả về một con trỏ (iterator) trỏ tới
đầu côngtenơ để bắt đầu trỏ tiến về
phía trước qua côngtenơ
End() Trả về một con trỏ trỏ tới vị trí quá vị
trí cuối cùng của một côngtenơ, được
dùng để kết thúc một con trỏ tiến
Rbegin() Trả về một con trỏ ngược trỏ tới cuối
côngtenơ để bắt đầu trỏ lùi qua
côngtenơ
Rend() Trả về một con trỏ ngược trỏ tới đầu
côngtenơ được dùng để kết thúc một
con trỏ lùi

Nhiều hàm thành viên khác nhau chỉ xuất hiện trong các côngtenơ nhất
định hoặc các loại côngtenơ nhất định.
4. Kiểu dữ liệu trừu tượng.
Có thể sử dụng các côngtenơ cơ bản để tạo một loại côngtenơ khác gọi là
một kiểu dữ liệu trừu tượng hay ADT (Abstract Data Type) . Một ADT là một
loại côngtenơ đơn giản hóa tập trung vào các khía cạnh cụ thể của một côngtenơ
cơ bản hơn, nó cung cấp một giao diện khác cho người lập trình. Các ADT được
cài đặt trong STL là ngăn xếp (stack), hàng đợi (queue) và hàng đợi ưu tiên
(priority queue). Một ngăn xếp hạn chế truy nhập bằng việc đặt vào và lấy ra
một mục dữ liệu ở đỉnh của ngăn xếp. Còn trong một hàng đợi, đặt các mục dữ
liệu ở một đầu và lấy chúng ra ở một đầu khác. Trong một hàng đợi ưu tiên, dữ
liệu được đặt vào ở một phần đầu theo một thứ tự ngẫu nhiên, nhưng khi lấy ra
ở đầu khác luôn luôn lấy mục dữ liệu lớn nhất được lưu trữ: hàng đợi ưu tiên tự

động sắp xếp dữ liệu giúp chúng ta.
10
Nhóm 31_TinC52
Cơ chế STL dùng để tạo ra ADT từ các kiểu cơ bản là bộ phận thích ứng
(adaptor). Các adaptor là các lớp mẫu chuyển các hàm được dùng trong ADT
thành các hàm được dùng bởi các côngtenơ nằm trong ADT
Ngăn xếp, hàng đợi, hàng đợi ưu tiên được tạo ra từ các côngtenơ tuần tự
khác nhau nhưng hàng đợi hai đầu (deque) thường được sử dụng nhất.
Các kiểu dữ liệu trừu tượng:
Côngtenơ Cài đặt Đặc điểm
Stack Có thể cài đặt như
vetor, list hoặc deque
Chèn (push, insert) và xóa ở một đầu
Queue Có thể cài đặt như list
hoặc deque
Chèn tại một đầu và xóa ở một đầu
khác
Priority
queue
Có thể cài đặt như
vetor hoặc deque
Chèn (push, insert) theo thứ tự ngẫu
nhiên và xóa (remove, pop) theo thứ
tự đã được sắp xếp ở một đầu khác
Chúng ta có thể sử dụng một mẫu (template) trong một mẫu để tạo một
ADT. Ví dụ đây là một ngăn xếp lưu trữ kiểu int, được tạo ra từ côngtenơ
deque:
Stack<deque<int> > astak;
Chú ý: Phải chèn một khoảng trắng cào giữa hai dấu ngoặc nhọn để trình
biên dịch không tưởng là toán tử >>

III. Các giải thuật (Algorithm).
Trong STL một giải thuật là một hàm cho trước để làm việc gì đó cho các
mục dữ liệu bên trong một côngtenơ (hay trong các côngtenơ).
Chú ý là giải thuật trong STL không phải là các hàm thành viên hay thậm
chí là các hàm bạn của các lớp côngtenơ. Chúng ta có thể sử dụng các giải thuật
11
Nhóm 31_TinC52
với các mảng có sẵn trong C++ hoặc với các lớp côngtenơ tự tạo (cho các lớp
các hàm cơ bản xác định).
Để sử dụng các giải thuật (Algorithm), các bạn phải khai báo thư viện STL
Algorithm:
#include <algorithm>
Các giải thuật được chia thành các nhóm:
- Nhóm các hàm không thay đổi container
- Nhóm các hàm thay đổi container
- Nhóm các hàm sắp xếp
- Nhóm các hàm trên danh sách được sắp xếp
- Nhóm các làm trên heap
- Nhóm các hàm tìm min/max
Một vài giải thuật đại diện hay dùng:
Giải thuật Chức năng
Find Tìm kiếm phần đầu tiên trong một côngteno mà có giá trị
được chỉ rõ.
Count Đếm số phần tử trong một côngteno có giá trị được chỉ rõ.
Search Tìm kiếm một dãy các phần tử cho bởi một côngteno trong
một côngtenơ khác.
Sort Sắp xếp các phần tử trong một côngtenơ theo một thứ tự
được chỉ rõ.
Merge Dùng để trộn các côngtenơ vào một côngtenơ.
Thêm _if vào

các giải thuật
Các giải thuật này có một tham số phụ, nó là một đối tượng
hàm hoặc một hàm.(vd: find_if, replace_if,…)
For_each Thực hiện một hàm được chỉ rõ cho từng phần tử trong một
côngtenơ.
Transform Làm một việc gì đó với tất cả các mục dữ liệu trong một
côngtenơ và đặt các giá trị kết quả trong một côngtenơ
khác.
Giả sử chúng ta sắp xếp một mảng các số nguyên theo chiều tăng:
12
Nhóm 31_TinC52
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int arr[]={4,10,5,8,9};
int n=0;
sort(arr,arr+5); //sap xep cac so
for(int j=0;j<5,j++ //hien thi
cout<<arr[j]<<’’;
}
return 0;
Kết quả đưa ra của chương trình:
4 5 8 9 10
IV. Con trỏ (iterators).
Các con trỏ (iterators) là các thực thể giống như các con trỏ được sử dụng
để truy nhập các mục dữ liệu (nó thường được gọi là các phần tử) trong một
côngtenơ. Thông thường, chúng được sử dụng để di chuyển liên tiếp từ phần tử
này sang phần tử kia. Một quá trình được gọi là con trỏ (iterating) qua côngtenơ.

Có thể tăng một côngtenơ với các toán tử ++ để nó trở tới phần tử tiếp theo và
có thể tham chiếu ngược (dereference) nó với toán tử * để láy giá trị của phần tử
nó trỏ tới.
Giống như một con trỏ trỏ tới một phần tử mảng, một vài kiểu iterator có
thể lưu trữ ( hoặc nhớ) vị trí của một phần tử côngtenơ cụ thể. Trong STL, một
iterator biểu diễn bằng một đối tượng của một lớp iterator.
Các iterator khac nhau phải được dùng với các kiêu côngtenơ khác nhau.
Có ba lớp iterator chính là: iterator tiến (forward iterator), iterator hai chiều
(bidirectional iterators) và iterator truy nhập ngẫu nhiên (rondom-accsess
13
Nhóm 31_TinC52
iterator). Một iterator tiến chỉ có thể di chuyển về phía trước qua côngtenơ mỗi
lần một mục dữ liệu. Toán tử ++ của nó thực hiện việc này. Nó không thể di
chuyển lùi lại và không thể tới một vị trí tùy ý ở giữa côngtennơ. Một iterator
hai chiều có thể di chuyển cả tiến và lùi, bởi vậy nó định nghĩa cả hai toán tử ++
và . Một iterator truy nhập ngẫu nhiên, ngoài khả năng di chuyển tiến và lùi
nó có thể nhảy tới một vị trí tùy ý trong côngtennơ.
Cũng có hai loại iterator đặc biệt iterator vào (input iterator) và iterator ra
(output iterator). Một iterator vào có thể “trỏ tới” một thiết bị vào (cin hoặc file)
để đọc các mục dữ liệu liên tiếp vào một congtennơ. Một iterator ra có thể “ trỏ
tới” một thiết bị ra (như cout hoặc file) và ghi các phần tử từ một côngtenơ tới
thiết bị đó
Mặc dù giá trị của các iterator tiến , iterator hai chiều, iterator truy nhập
ngẫu nhiên có thể được lưu trữ ( để chúng có thể sử dụng sau đó) nhưng các giá
trị của iterator vào và ra không thể lưu trữ. Điều này có lý, bởi vì 3 iterator đầu
trỏ tới các vùng nhớ trái lại iterator vào và ra trỏ tới các thiết bị I/O nên việc lưu
trữ các giá trị “con trỏ” là không có ý nghĩa.
Các đặc điểm của iterator:
iterator Đọc/ghi Iterator có
thể lưu trữ?

Hướng Truy nhập
Random
-acsess
Đọc và ghi Có Tiến và lùi Ngẫu nhiên
Bidirectional Đọc và ghi Có Tiến và lùi Tuyến tính
Forward Đọc và ghi Có Chỉ tiến Tuyến tính
Output Chỉ ghi Không Chỉ tiến Tuyến tính
Input Chỉ đọc Không Chỉ tiến Tuyến tính

V. FUNTION OBJECT ( FUNCTOR ).
1. Khái niệm.
14
Nhóm 31_TinC52
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.
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
- Có khai báo operator()
2. 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 đó.
- 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 ==
3. Sử dụng Funtion Object.
Ví dụ ta viết một hàm bình thường như sau:
15
Nhóm 31_TinC52
void iprintf(int i) const
{
cout<<i<<endl;
}
Bây giờ ta sẽ viết một lớp như sau:
class iprintf
{
public:
void operator()(int i) const
{
cout<<i<<endl;
}
};
Trường hợp của lớp này là một object được gọi là function object, là một
object được sử dụng như một function. Sử dụng như thế nào ?

iprintf x;
x(5);
hoặc
iprintf()(5);
Khi ta gọi iprintf()(5) nghĩa là chúng ta đang gọi đến operator() của lớp iprint.
4. Thư viện Functonal.
- 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 (divides) chia lấy dư (modulus) đổi dấu (negate).
Ví dụ:
negate:
int a[]={1,-2,3};
transform(a,a+3,a,negate<int>());
for_each(a,a+3,Output<int>());
plus:
16
Nhóm 31_TinC52
int a[]={1,2,3,4,5};
int b[]={6,7};
int c[5];
transform(a,a+5,b,c,plus<int>());
modulus:
int a[]={1,2,3,4,5};
int b[]={2,2,2,2,2};
int c[5];
transform(a,a+5,b,c,modulus<int>());
B. Chương trình.
#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 hoten[30];
char lop[15];
float dtb;
public:
void nhap();
void hien();
void timkiem();
};
class comp_student:public binary_function<SV,string, bool>
17
Nhóm 31_TinC52
{
public:
{
bool operator()( const SV& abc, const string &name ) const
{
return (abc.hoten == name);
}
};
};
//=======CHUONG TRINH CHINH=========

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();

18
Nhóm 31_TinC52
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;
}
Kết luận

19
Nhóm 31_TinC52
Nhóm thực hiện đã cố gắng giới thiệu một vài nét về thư viện STL- thư viện
mẫu chuẩn của C++. Tuy nhiên sự tìm hiểu của nhóm còn hạn chế. Để tìm hiểu
được hết các tính năng, sử dụng được thành thạo,khai thác triệt để các thế mạnh
của thư viện STL cần có một quá trình tìm hiểu lâu dài và đúc kết kinh nghiệm.
Nhóm thực hiện mong các bạn có thể thực hiện được điều này vì đây là thư viện
tiêu biểu của C++, có thể giúp bạn giải quyết công việc nhanh chóng, sử dụng
được thư viện này là rất hay và hữa ích.
Tài liệu tham khảo
20
Nhóm 31_TinC52
1. Bài giảng: Ngôn ngữ lập trình C ++ và lập trình hướng đối tượng.
Thầy : Ngô Công Thắng
2. Ngôn ngữ lập trình C ++ và cấu trúc dữ liệu.
Tác giả :Nguyễn Việt Hương
3. C++ và lập trình hướng đối tượng.
GS.Phạm Văn Ất, NXB GTVT, 2005.
4. Lập trình hướng đối tượng với C++.
Nguyễn Thanh Thủy và đồng nghiệp
5. Bài giảng ngôn ngữ lập trình C/C++.
Phạm Hồng Thái – ĐH Công Nghệ - ĐHQGHN
6. .
7. Và một số tài liệu khác.
21

×