Tải bản đầy đủ (.ppt) (38 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 (238.71 KB, 38 trang )


Bá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ố : 08
Nhó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


Đề tài:
Tìm hiểu về thư viên STL: Tổng quan về STL,
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.


Nộ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.
1.2. Các côngtenơ (container).
1.3. Các giải thuật (Algorithm).
1.4. Con trỏ (Iterators).


1.5 Function Object.
2. Bài tập.


1. Tìm hiểu về thư viện STL.
1.1 Giới thiệu về thư viện STL.

STL (Standard Template Library) là một thư viện
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).


1. Tìm hiểu về thư viện STL.
1.1 Giới thiệu về thư viện STL.

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.


Đă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.


1. 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:

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


1. 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:

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)


1. Tìm hiểu về thư viện STL.
1.2 Các côngtenơ (containers).

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)

container liên kết (set, 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. 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 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ó.
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ớ.


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


Ví dụ:
#include<iostream>
#include<conio.h>
#include<vector>
using namespace std;

int main()
{
vector<int> vec; //Khai báo 1 vector số nguyên
vec.push_back(2); //thêm phần tử vào cuối vector
vec.push_back(1);
vec.push_back(1);
cout<<”Xuất vector: “<<endl;
for (int i=0; i<vec.size(); i++)
cout<<vec[i]<<” “;
getch();
return 0;
}


1. 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.

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. 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.

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.


1. 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”.


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


1. 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.

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 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ể

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ơ
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


1. 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).




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.


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 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


1. Tìm hiểu về thư viện STL.
1.3 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 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)

Một vài gải thuật STL tiêu biểu:




1. Tìm hiểu về thư viện STL.
1.4 Con trỏ (iterator).

Các con trỏ (iterator) 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à 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.


1. Tìm hiểu về thư viện STL.
1.4 Con trỏ (iterator).

Có ba lớp iterator chính là:

iterator tiến (forward iterator),

iterator hai chiều (bidirectional iterators)

iterator truy nhập ngẫu nhiên (rondom-accsess
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. 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ơ.



1. Tìm hiểu về thư viện STL.
1.4 Con trỏ (iterator).

Cũng có hai loại iterator đặc biệt là:

iterator vào (input iterator)

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 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ị
đó


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

×