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íc
Trang 1Báo cáo bài tập lớn môn
Lập trình hướng đối tượng
GVHD : Ngô Công Thắng Lớp : TinC-K52
Đề tài số : 08Nhóm SVTH: Đỗ 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
Trang 2Đề tài:
Algorithm, Iterator 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
Trang 3Nội dung báo cáo
1 Tìm hiểu về thư viện STL (Standard Template Library).
1.1 Giới thiệu về thư viện STL.
Trang 41 Tìm hiểu về thư viện STL
1.1 Giới thiệu về thư viện STL.
template 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)
Trang 51 Tìm hiểu về thư viện STL
1.1 Giới thiệu về thư viện STL.
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 )
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
trình biên dịch ở cả hai môi trường WINDOWS lẫn UNIX
Trang 61 Tìm hiểu về thư viện STL
1.1 Giới thiệu về thư viện STL.
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:
vector và deque
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
Trang 71 Tìm hiểu về thư viện STL
1.1 Giới thiệu về thư viện STL.
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:
gồm stack, queue và priority_queue
Trang 81 Tìm hiểu về thư viện STL
1.2 Các côngtenơ (containers).
liệu có sẵn như int, float và các đối tượng lớp
chia làm 2 loại:
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)
Trang 91 Tìm hiểu về thư viện STL
1.2 Các côngtenơ (containers).
1.2.1 Côngteno tuần tự
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ó
Vd: Một mảng C++ là một côngtenơ tuần tự
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ớ
Trang 10Cá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
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
Trang 11vec.push_back(1);
cout<<”Xuất vector: “<<endl;
for (int i=0; i<vec.size(); i++)
cout<<vec[i]<<” “;
getch();
return 0;
}
Trang 121 Tìm hiểu về thư viện STL
1.2 Các côngtenơ (containers).
1.2.2 Côngtenơ liên kết
thay vào đó sử dụng các khóa để truy nhập dữ liệu 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 biết khóa thì chúng ta
có thể nhanh chóng truy nhập tới giá trị liên kết
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
Trang 131 Tìm hiểu về thư viện STL
1.2 Các côngtenơ (containers).
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”
Trang 14Cá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
Trang 151 Tìm hiểu về thư viện STL
1.2 Các côngtenơ (containers).
1.2.3 Hàm thành viên
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 hàm 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ể
côngtenơ:
Trang 16Tê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ơ
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
Trang 171 Tìm hiểu về thư viện STL
1.2 Các côngtenơ (containers).
1.2.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)
Trang 18
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
Trang 19Ngă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 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
Trang 201 Tìm hiểu về thư viện STL
1.3 Các giải thuật (Algorithm).
việc gì đó cho các mục dữ liệu bên trong một côngtenơ (hay trong các côngtenơ)
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 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)
Trang 221 Tìm hiểu về thư viện STL
1.4 Con trỏ ( iterator ).
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à 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
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
Trang 231 Tìm hiểu về thư viện STL
1.4 Con trỏ ( iterator ).
iterator)
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 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ơ
Trang 241 Tìm hiểu về thư viện STL
1.4 Con trỏ ( iterator ).
file) để đọc các mục dữ liệu liên tiếp vào một côngtennơ 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ị
đó
Trang 25Cá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
Trang 261 Tìm hiểu về thư viện STL
1.5 Function Object.
a, Khái niêm:
(đố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
Trang 271 Tìm hiểu về thư viện STL
1.5 Function Object.
lớp đó phải có ít nhất một hàm thỏa:
hàm friend
Trang 281 Tìm hiểu về thư viện STL
1.5 Function Object.
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
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)
của hai kiểu bất kỳ và trả về giá trị nào đó
Trang 291 Tìm hiểu về thư viện STL
tử so sánh tương đương ==
Trang 301 Tìm hiểu về thư viện STL
1.5 Function Object.
Khai báo: #include <functional>
gồm cộng (plus) trừ (minus) nhân (multiplies) chia
(divides) chia lấy dư (modulus) đổi dấu (negate)
Trang 312 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
Trang 33class comp_student:public binary_function<SV,string, bool>
Trang 34//=======CHUONG TRINH CHINH=========
//Nhap danh sanh sinh vien
cout<<"\tNhap thong tin chi tiet cua tung sinh vien"<<endl;
Trang 35//Hien danh sach sinh vien
cout<<"Danh sach sinh vien vua nhap:"<<endl;
Trang 37Tài liệu tham khảo
1 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 http://www.google.com
7 Và một số tài liệu khác