Professional Documents
Culture Documents
BÁO
Trước tiên, chúng em xin gửi lời cảm ơn chân thành nhất
tới thầy Ngô Công Thắng – giảng viên đã trực tiếp giảng dạy,
chỉ bảo chúng em trong quá trình học tập, đặc biệt là trong
khi làm đồ án này.
Xin chân thành cảm ơn tới tất cả các sinh viên, học viên
đang học tập và thực hiện đồ án cùng chúng mình đã chia sẻ tài
liệu và góp ý giúp chúng mình hoàn thiện đề án này.
VD: Mảng, danh sách, hàng đợi, ngăn xếp,... đều là tập hợp
các đối tượng được xây dựng theo kiểu lớp chứa. Tức là lớp
được dùng để xây dựng tập hợp các đối tượng.
Với các kiến thức thông thường, chúng ta hoàn toàn có thể
xây dựng những lớp chứa như vậy. Nhưng với mỗi kiểu phần tử,
chúng ta lại phải chỉnh sửa chương trình nguồn. Cách làm thế
này là không thuận tiện.
C++ cho phép chúng ta định nghĩa ra một lớp “tổng quát”,
kiểu của phẩn tử trở thành tham số. Khi cần sử dụng, chúng ta
chỉ cần cung cấp kiểu cụ thể của tham số là có thể tạo ra lớp
mới.
b. Định nghĩa:
chuyên môn hoá mẫu cho phép ta tạo ra những bản thực thi đặc
biệt khi làm việc với một loại dữ liệu xác định nào đó.nó cho
phép ta lựa chọn dữ liệu có tính chọn lọc.
Nếu một chương trình biên dịch C++ vẫn chưa tương thích với
chuẩn template của ANSI-C++ thì sẽ không thể sử dụng được
template.
VD về template:
template <class myType>
myType GetMax (myType a, myType b)
{
return (a>b?a:b);
}
1. Function tempalte.
Function template là các mẫu hàm cho phép tạo các hàm có
thể chấp nhận bất kì kiểu dữ liệu nào làm tham số và trả về
giá trị với kiểu dữ liệu của tham số mà không phải thực hiện
xây dựng nhiều hàm bằng cách định nghĩa chồng hàm với tất cả
các kiểu dữ liệu có thể xuất hiện.
Sự khác biệt duy nhất giữa hai kiểu khai báo mẫu này là
việc sử dụng từ khoá class hay typename, sự khác nhau giữa
chúng là không rõ ràng vì cả hai đều có cùng một ý nghĩa và
đều trả về một kết quả như nhau.
Hàm mẫu được gọi thông qua lời gọi hàm, nội dung của hàm
mẫu cũng giống như các hàm bình thường, chỉ khác một điều là
kiểu dữ liệu được hàm mẫu trả về là kiểu dữ liệu của đối số
nạp vào hàm mẫu. Chúng ta có cấu trúc gọi sau:
Tức là chúng ta gọi tên hàm, định kiểu dữ liệu của tham số
và gọi tham số truyền vào hàm giống như các hàm bình thường,
sẵn có của C++.
// function template
#include <iostream>
using namespace std;
int main () {
int i=5, j=6, k;
long l=10, m=5, n;
k=GetMax<int>(i,j);
n=GetMax<long>(l,m);
cout << k << endl;
cout << n << endl;
return 0;
}
VD:
Với hàm mẫu trên, chúng ta phân tích như sau: Dòng đầu tiên
chúng ta khai báo một template với kiểu dữ liệu tổng quát là
myType. Dòng lệnh thứ 2, myType là kiểu dữ liệu mà tham số a,b
được nạp vào, đồng thời myType cũng là kiểu dữ liệu trả về của
hàm GetMax.
Có thể hiểu tóm tắt như sau: Lúc đầu hàm mẫu nhận kiểu dữ
liệu tổng quát là myType, khi có tham số nạp vào thì kiểu dữ
liệu của hàm mẫu từ kiểu myType thành kiểu của tham số. Kiể dữ
liệu trả về cũng là kiểu dữ liệu mà tham số mang vào hàm mẫu.
2. Class template.
thời điểm khai báo lớp. Chúng ta cũng có thể sử dụng class
templates để xây dựng các lớp giống nhau về bản chất xử lý
nhưng khác nhau về kiểu dữ liệu. Chúng ta có thể khai báo mẫu
lớp như sau:
Khi cần sử dụng mẫu lớp này ta chỉ việc gọi tên mẫu lớp với
kiểu dữ liệu cần dùng.
template <class T>; //Kiểu phổ biến với một tham số kiểu.
template <class T, class U>; //Hai tham số kiểu.
template <class T, int N> //Một tham số kiểu, một tham số giá trị.
template <class T = char> //Với một giá trị ngầm định.
template <int TFunc (int)> //Hàm là một tham số cho template.
Template trong C++ giúp chúng ta xây dựng lên những hàm,
lớp tổng quát. Điều đó có nghĩa là trình biên dịch sẽ tự sinh
ra các hàm, lớp khác nhau dựa trên khuôn mẫu sẵn có mà không
phải viết nhiều lớp, hàm hoặc viết lại.
Nhiều chức năng của thư viện chuẩn C++ là các khai báo trong
không gian tên std.
Tác giả đầu tiên của STL là Alexander Stepanov, mục đích
của ông là xây dựng một cách thể hiện tư tưởng lập trình tổng
quát. Các khái niệm trong STL được phát triển độc lập với C++.
Do đó, ban đầu, STL không phải là một thư viện C++, mà nó đã
được chuyển đổi thành thư viện C++. Nhiều tư tưởng dẫn đến sự
phát triển của STL đã được cài đặt phần nào trong Scheme, Ada,
và C.
Thư viện chuẩn trong C++ gồm 32 thư viện. Trong đó, ngoại
trừ thư viện String ra thì tất cả các thư viện còn lại là thư
viện mẫu chuẩn. Sau đây là các thư viện chuẩn và miêu tả chung
của chúng:
bitset: Định nghĩa lớp tiêu bản bitset và các hàm hỗ trợ cho
việc hiển thị và điều chỉnh các dãy bit có độ dài cố định.
deque: Định nghĩa lớp tiêu bản deque (hàng) và nhiều tiêu
bản hỗ trợ.
list: Định nghĩa lớp tiêu bản list (danh sách) và nhiều tiêu
bản hỗ trợ.
map: Định nghĩa lớp tiêu bản map và <multimap> và nhiều tiêu
bản hỗ trợ.
queue: Định nghĩa các lớp tiêu bản priority_queue và queue
cùng với nhiều tiêu bản hỗ trợ.
set: Định nghĩa lớp tiêu bản set và nhiều tiêu bản hỗ trợ.
stack: Định nghĩa lớp tiêu bản stack (chồng) và các tiêu bản
hỗ trợ.
vector: Định nghĩa lớp tiêu bản vector và nhiều tiêu bản hỗ
trợ.
algorithm: Định nghĩa nhiều hàm thực thi các thuật toán về
thùng chứa trong Thư viện tiêu bản chuẩn STL.
functional: Định nghĩa các hàm nhằm giúp cho việc xây dựng
các đối tượng hàm trong Thư viện tiêu bản chuẩn (còn có tên là
hàm tử).
iterator: Định nghĩa các biến lặp cơ bản, định nghĩa sẳn các
biến lặp, biến lặp dòng, cũng như là các tiêu bản hỗ trợ.
locale: Định nghĩa các lớp tiêu bản và các hàm mà chưong
trình C++ có thể dùng để tạo đặc tính đóng và điều chỉnh các
yếu tố định dạng và biểu thị của các số, tiền tệ, dữ liệu về
ngày tháng bao gồm hỗ trợ ngôn ngữ quốc tế cho sự phân lớp kí
tự và sự sắp xếp dãy kí tự.
memory: Định nghĩa một lớp, một toán tử và nhiều tiêu bản
nhằm giúp cấp phát và trả về (vùng nhớ) của các đối tượng.
stdexcept: Định nghĩa nhiều lớp chuẩn dùng cho việc báo cáo
các ngoại lệ. Các lớp tạo nên một hệ phân nhánh mà tất cả đều
dẫn xuất từ lớp exception và bao gồm hai kiểu ngoại lệ thông
dụng: lỗi lô-gíc và lỗi trong thời gian thi hành.
utility: Định nghĩa các kiểu, hàm, và toán tử trong Thư viện
tiêu bản chuẩn STL nhằm giúp cho việc xây dựng và quản lý các
cặp đối tưọng. Nó hữu dụng, khi hai đối tượng cần được hành xử
như chúng là một.
fstream: Định nghĩa các lớp hỗ trợ các phép toán cho dòng
xuất nhập (iostream) trên các chuỗi chứa trong các tập tin bên
ngoài.
ios: Định nghĩa nhiều kiểu và hàm cơ bản cho các xử lý của
các dòng xuất nhập. Tiêu đề này thưòng bao gồm nhiều tiêu đề
dòng xuất nhập khác mà ít khi được khai báo qua lệnh #include
trực tiếp.
iosfwd: Khai báo trước các tham chiếu cho nhiều tiêu bản để
dùng suốt quá trình xuất nhập dòng. Tấr cả các tiêu bản như
vậy được định nghĩa trong các tập tin tiêu đề chuẩn khác. Chỉ
xử dụng tập tin tiêu đề này khi cần có một trong số các khai
báo của nó, nhưng không phải là định nghĩa của nó.
iomanip: Định nghĩa nhiều phép điều chỉnh mà nó lấy vào một
đối số.
istream: Định nghĩa lớp tiêu bản basic_istream, tiêu bản này
làm trung gian cho các sự chèn vào và lấy ra (dữ liệu). Tiêu
đề cũng định nghĩa một bộ điều chỉnh. Tập tin tiêu đề này
thường được sử dụng bởi các tiêu đề về dòng xuất nhập khác, nó
hiếm khi được bao gồm trực tiếp trong mã nguồn của người lập
trình.
ostream: Định nghĩa lớp tiêu bản basic_ostream, tiêu bản này
làm trung gian cho các sự chèn (dữ liệu) vào cho các dòng xuất
nhập. Tiêu đề cũng định nghĩa một bộ điều chỉnh. Tập tin tiêu
đề này thường được sử dụng bởi các tiêu đề về dòng xuất nhập
khác, nó hiếm khi được bao gồm trực tiếp trong mã nguồn của
người lập trình.
sstream: Định nghĩa nhiều lớp tiêu bản mà nó hổ trợ các phép
toán của dòng xuất nhập trên các chuỗi (dữ liệu) chứa trong
một đối tượng mảng đã dược cấp phát vùng nhớ. Những chuỗi này
rất dể chuyển đổi để tạo thành các đối tượng của lớp tiêu bản
basic_string.
streambuf: Bao gồm tiêu đề chuẩn cho các dòng xuất nhập của
<streambuf> dùng để định nghĩa lớp tiêu bản basic_streambuf.
Lớp này là cơ sở cho phép toán của các lớp của dòng xuất nhập.
Tiều đề này thường được bao gồm sẵn trong các tiêu bản về dòng
xuất nhập khác, nó hiếm khi được bao gồm trực tiếp trong mã
nguồn của người lập trình.
numeric: Định nghĩa các hàm tiêu bản thùng chứa nhằm tiến
hành các thuật toán cung cấp cho việc xử lí số.
valarray: Định nghĩa lớp tiêu bản valarray hỗ trợ các lớp
tiêu bản và các hàm.
new: Định nghĩa nhiều kiểu và hàm mà nó điều khiển việc cấp
phát cũng như trả về (bộ nhớ) của kho dự trữ dưới sự kiểm soát
của chương trình. Nó cũng định nghĩa các thành phần cho việc
báo cáo về quản lý của kho dự trữ.
first-class container.
first-class container
○ empty
○ max_size, size
○ swap
○ begin, end
○ rbegin, rend
○ erase, clear