1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

21 667 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 21
Dung lượng 213,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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ệnchuẩn STL với việc tìm hiểu các côngteno container, các giải thuậtAlgorithm, các iterator con trỏ, Function Object

Trang 1

TRƯỜNG ĐẠI HỌC NÔNG NGHIỆP HÀ NỘI

KHOA CÔNG NGHỆ THÔNG TIN

Trang 2

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

Trang 3

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

Trang 4

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ônngữ máy Ngoài ra, với khả năng lập trình theo mẫu ( template ), C++ đã khiếnngô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ônngữ khác Sức mạnh của C++ đến từ STL, viết tắt của Standard TemplateLibrary - 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 đã đề rakhá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ẩnSTL

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ệnchuẩn STL với việc tìm hiểu các côngteno (container), 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ựchiện

Trang 5

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ẩncho C++ được phát triển vào năm 1992, với mong muốn có được những cấutrú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ínhhiệ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à STLPort (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àytrong xử lý thuận tiện cho việc chia sẻ mã nguồn với cộng đồng phát triển

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

Trang 6

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

Những thành phần này làm việc chung với các thành phần khác để cungcấ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ấutrúc dữ liệu cơ bản (stack, queue, map, set ) Ngoài ra, STL còn bao gồm cácthuậ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ácnhau), 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ênviệ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ônngữ 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ả haimô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ệnchuẩn được thiết kế bởi những chuyện gia hàng đầu và đã được chứng minh tínhhiệ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 đượckhuyến cáo sử dụng thay vì dùng những phần viết tay bên ngoài hay nhữngphương tiện cấp thấp khác Thí dụ, dùng std::vector hay std::string thay vì dùngkiể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

Trang 7

chia làm 2 loại: container tuần tự (vector, list, deque) và 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ệutrừ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

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 nhanhList 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ậmDeque 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ốinhanh

Trang 8

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 airtimeChú ý: không cần xác định kích thước cho côngtenơ Các côngtenơ tự chúngquan 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ácchuỗ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óathì 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ậphợ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ộtgiá trị Điều này giống như một danh bạ điện thoại, ở đó mỗi người chỉ có duynhất một số điện thoại Trái lại, các côngtenơ đa ánh xạ (multimap) và đa tậphợp (multiset) cho phép có nhiều khóa Ví dụ, trong một quyển từ điển tiếngAnh có thể có vài mục cho từ “set”

Trang 9

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óacho 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ấtvớ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 đốitượ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ệnnhữ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

của côngtenơ

Trang 10

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ơ

trí cuối cùng của một côngtenơ, được dùng để kết thúc một con trỏ tiến

côngtenơ để bắt đầu trỏ lùi qua côngtenơ

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ộtloạ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 đượccà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 ramộ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 11

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

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ộtADT 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ìnhbiê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ácmụ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ậmchí 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

Trang 12

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ớpcá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 STLAlgorithm:

#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/maxMộ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ị

Merge Dùng để trộn các côngtenơ vào một côngtenơ

Thêm _if vào

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:

Trang 13

sort(arr,arr+5); //sap xep cac so

for(int j=0;j<5,j++ //hien thi

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ộtcô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ộtiterator 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

Trang 14

iterator) Một iterator tiến chỉ có thể di chuyển về phía trước qua côngtenơ mỗilầ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ể dichuyển lùi lại và không thể tới một vị trí tùy ý ở giữa côngtennơ Một iteratorhai 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ớithiết bị đó

Mặc dù giá trị của các iterator tiến , iterator hai chiều, iterator truy nhậpngẫ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 đầutrỏ 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ưutrữ 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

V FUNTION OBJECT ( FUNCTOR ).

1 Khái niệm.

Ngày đăng: 14/04/2015, 09:00

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w