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

Đ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 1,4 MB

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

Nội dung

Các thành phần chính của STL STL chứa nhiều thành phần khác nhau, trong đó quan trọng nhất là containers, algorithms vàiterators:  Container các bộ lưu trữ dữ liệu là các cấu trúc dữ li

Trang 1

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

KHOA CÔNG NGHỆ THÔNG TIN

BÀI TẬP LỚN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Đề tài 7: “Tìm hiểu về thư viên STL: Tổng quan về STL, Sequence Containers,

Associative Containers và Algorithms 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 Sắp xếp danh sách sinh viên theo điểm TBC giảm dần 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 và algorithms sort để sắp xếp danh sách sinh viên”.

Giảng viên hướng dẫn : Ngô Công Thắng

Nhóm sinh viên thực hiện

(Nhóm 39)

: Nguyễn Thị Gấm Chu Thị Thanh Hương Nguyễn Thị Xuân Mai Nguyễn Thị Nga

Hà Nội 2010 MỤC LỤC

Trang 2

A Tổng quan về STL 3

I Giới thiệu về thư viện chuẩn STL 3

II Các thành phần chính của STL 3

B Container 4

I Container tuần tự (Sequential container) 4

1 Vector 5

1.1/ Cú pháp 5

1.2/ Các phương thức 6

1.3/ Kiểm tra tràn chỉ số mảng 7

2 Deques 8

2.1/ Các khả năng của Deque 9

2.2/ Hoạt động của Deque 9

3 Lists 10

II Container liên kết (Asociative container) 11

1 Định nghĩa 11

2 Các Côngtenơ liên kết cơ bản: 12

2.1/ Map .12

2.2/ Multimap 13

2.3/ Set 13

2.4/ Multiset 14

3 Một số kiểu khác 14

3.1 Kiểu hash_map (ánh xạ dùng mảng băm) 14

3.2 Kiểu hash_set (tập hợp) 14

C THƯ VIỆN ALGORITHM 15

1 Nhóm các hàm không thay đổi container 15

2 Nhóm các hàm thay đổi container 15

3 Nhóm các hàm sắp xếp 17

4 Nhóm hàm trên danh sách được sắp xếp 18

5 Các hàm trên heap 19

6 Các hàm tìm MIN & MAX 19

D Viết chương trình 20

TÀI LIỆU THAM KHẢO

A Tổng quan về STL

Trang 3

I Giới thiệu về thư viện chuẩn STL

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áiquát, không cụ thể và chi tiết như nhiều ngôn ngữ khác

Dựa vào kỹ thuật sử dụng template trong lập trình hướng đối tượng, Alexander Stepanovcủa phòng thí nghiệm hãng Hewlett Parket (HP) tại Palo, California đã tiến hành xây dựng mộtthư viện template cho C++ vào năm 1992 với mong muốn có được những cấu trúc dữ liệu cũngnhư giải thuật tổng quát và hiệu quả nhất Sau đó 2 năm, vào ngày 14/6/1994 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 StandardTemplate Library (STL)

Trong giai đoạn tiếp theo, STL đã được nhiều tổ chức, hãng phần mềm mở rộng và pháttriể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++ Builder 6) Cũng xuất phát từ ý tưởng của STL (đồngthời cũng sử dụng chính thư viện này làm nền tảng), một số thư viện standard template khác rađời phục vụ các lớp ứng dụng đặc thù hơn, như thư viện cho ma trận - MTL (trường đại họcNotre Dame - Pháp) hay thư viện cho đồ thị - GTL (trường đại học Passau - Đức)

STL hỗ trợ sẵn cho các bạn khá nhiều cấu trúc dữ liệu mà khi cài đặt các thuật toán bạnthường sử dụng, giúp tiết kiệm thời gian, và nhất là tối ưu về tốc độ và sự mềm dẻo Bởi cácthuật toán sử dụng để cài đặt STL đều là tối ưu, được các kỹ sư và nhà toán học hằng đầu thếgiới nghiên cứu và phát triển

II Các thành phần chính của STL

STL chứa nhiều thành phần khác nhau, trong đó quan trọng nhất là containers, algorithms vàiterators:

 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, bao gồm cả các kiểu dữ liệu có sẵn như int, float và các

đối tượng lớp Các container chia làm 2 loại:

+ Container tuần tự (Sequential container)

+ Container liên kết (Asociative container)

 Iterators (biến lặp) là một dạng khái quát hóa của khái niệm con trỏ Chúng trỏ tới các phần

tử trong một container Các iterator là thành phần chủ yếu của STL vì chúng nối các giảithuật với các container và nối các thành phần khác với nhau

 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 Trong STL các giải thuật được biểu diễn bởi các hàmmẫu (Template function) Các hàm này không phải là hàm thành viên của lớp container.Chúng là các hàm đứng một mình

Khái niệm của STL được dựa trên một tách dữ liệu và hoạt động Dữ liệu được quản lý bởilớp container và các hoạt động được định nghĩa bởi các thuật toán cấu hình Vòng lặp là keo giữahai thành phần Thư viên STLđể cho bất kỳ thuật toán tương tác với bất kỳ container như hìnhdưới:

Trang 4

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ớinhiề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ậptrình luôn thể hiện tính khái quát hóa cao.

Thư viện STL được hỗ trợ trên các trình biên dịch ở cả hai môi trường WINDOWS lẫnUNIX, vì vậy khi sử dụng thư viện này trong xử lý thuận tiện cho việc chia sẽ mã nguồn

Các chức năng của thư viện chuẩn C++ được khai báo trong namespace std;

B Container

Container (thùng chứa) là khái niệm chỉ các đối tượng lưu trữ các đối tượng (giá trị) khác.

Đối tượng container sẽ cung cấp các phương thức để truy cập các thành phần (element) của nó Container bao gồm nhiều lớp cơ bản của C++: lớp Vector, lớp danh sách (List) và các kiểu hàngđợi (Stack và Queue), lớp tập hợp (Set) và lớp ánh xạ (Map)

Trang 5

STL có sẵn bảy loại container cơ bản, hơn ba loại container được rút ra từ các loại cơbản này Ngoài ra chúng ta cũng có thể tạo ra các container của riêng mình dựa trên các loạicontainer cơ bản.

 Các container STL chia làm 2 loại:

+ Container tuần tự (Sequential container) bao gồm danh sách (list), vectơ (vector) và hàngđợi hai đầu (deque)

+ Container lien kết (Asociative container) bao gồm ánh xạ (map), đa ánh xạ (multimap), tậphợp (set) và đa tập hợp (multiset)

I Container tuần tự (Sequential container)

Một container tuần tự (sequencial container) lưu trữ một tập hợp các phần tử mà có thể hìnhdung như một đường thẳng, 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ề container tuần tự

1 Vector

Lớp mảng động vector<T> có sẵn trong thư viện chuẩn STL của C++ định nghĩa một

mảng động các phần tử kiểu T

 Vector có các tính chất sau:

 Không cần khai báo kích thước của mảng, vector có thể tự động cấp phát bộ nhớ, co giãn

kích thước vector khi chèn hoặc xóa dữ liệu, bạn sẽ không phải quan tâm đến quản lý

kích thước của nó

 Chúng ta có thể sử dụng vector y như các mảng, truy nhập các phần tử của nó với toán tử

“[]” Việc truy cập ngẫu nhiên như vậy rất nhanh với các vector

 Vector còn có thể cho bạn biết số lượng các phần tử mà bạn đang lưu trong nó

 Vector có các phương thức của stack, được tối ưu hóa với các phép toán ở phía đuôi (rearoperations)

 Hỗ trợ tất cả các thao tác cơ bản như chèn, xóa, sao chép

 Những toán tử so sánh được định nghĩa cho vector: ==, <, <=, !=, >, >=

1.1/ Cú pháp

Để có thể dùng vector thì bạn phải thêm 1 header #include <vector> và phải có using std::vector;

Cú pháp của vector rất đơn giản, ví dụ :

vector<int> v; // khởi tạo 1 vector có kích thước ban đầu là 0

vector<int> v(10); // khởi tạo size = 10

vector<int> v(10, 2); //10 phần tử của vector A sẽ được khởi tạo bằng 2

Khai báo vector v có kiểu int

Chú ý kiểu của vector được để trong 2 dấu ngoặc nhọn “< >”

Theo dõi ví dụ sau:

Trang 6

Trường hợp xác định kích thước mảng khi chương trình đang chạy, chúng ta dùng hàm

tạo mặc định để khai báo mảng chưa xác định kích thước, sau đó dùng phương thức resize( size

_tn ) để xác định kích thước của mảng khi cần.

 Khi một vector đã chứa dữ liệu, dữ liệu này có thể được truy nhập - cả đọc và ghi - bằng toán

tử [] giống như trong mảng Tuy nhiên, không thể dùng toán tử “[]” để truy xuất các phần tử

mà nó không tồn tại

 Hàm thành viên size() trả về số phần tử hiện có trong vector

 Hàm thành viên front() trả về giá trị của phần tử đầu trong vector

Trang 7

 Hàm thành viên back() trả về giá trị của phần tử cuối cùng trong vector.

 Hàm thành viên pop_back( ): Lấy dữ liệu ở cuối vector ra khỏi vector

1.2.2/ Hàm thành viên insert() và erase().

Hai hàm thành viên trên dùng để chèn hoặc xoá một phần tử từ một vị trí bất kì trongcontainer Các hàm thành viên này có hiệu suất thấp do tất cả các phần tử ở trên vị trí chèn hoặcxoá phải được di chuyển Tuy nhiên, việc chèn hoặc xóa có thể hữu ích nếu không sử dụng quánhiều

Hàm thành viên insert() có hai đối số: vị trí mà phần tử mới sẽ được chèn vào và giá trịcủa phần tử được chèn vào Các phần tử từ điểm chèn tới cuối container được di chuyển lên đểtạo khoảng trống, kích thước của container tăng lên 1

Hàm thành viên erase() xóa một phần tử tại một vị trí xác định Các phần tử phía trênđiểm xóa được di chuyển xuống, kích thước của container giảm đi 1

1.2.3/ Một số hàm khác và chức năng

Hàm thành viên empty(): Để xác định vector có rỗng hay không ta dùng hàm thành viên

empty(), hàm này trả về true nếu vector rỗng, và false ngược lại

Cú pháp : if(v.empty() == true)

{ cout << "Khong co du lieu trong vector \n"; }

capacity() : Trả về số lượng phần tử tối đa mà vector được cấp phát, đây là 1 con số có thể

thay đổi do việc cấp phát bộ nhớ tự động hay bằng các hàm như reserve() và resize()

reserve():cấp phát vùng nhớ cho vector, giống như realloc() của C và không giống vector::resize(), tác dụng của reserve để hạn chế vector tự cấp phát vùng nhớ không cần

thiết.Ví dụ khi thêm 1 phần tử mà vượt quá capacity thì vector sẽ cấp phát thêm, việc này lặp

đi lặp lại sẽ làm giảm performance trong khi có những trường hợp ta có thể ước lượng đượccần sử dụng bao nhiêu bộ nhớ

swap(): hoán đổi hai container với nhau (giống việc hoán đổi giá trị của 2 biến)

Ví dụ : v1.swap(v2);

1.3/ Kiểm tra tràn chỉ số mảng

Có một vấn đề chưa được đề cập đến từ khi ta làm quen với vector, đó là khả năng kiểm tra trànchỉ số mảng (range check)

 Nếu sử dụng cú pháp biến_vector[chỉ_số], chương trình sẽ không tạo ra lỗi khi sử dụng chỉ

số mảng nằm ngoài vùng hợp lệ (giống như mảng thường) Nếu chúng ta chỉ lấy giá trị phần

tử với chỉ số không hợp lệ, trường hợp này chỉ cho kết quả sai Nhưng nếu chúng ta gán giátrị cho phần tử không hợp lệ này, hậu quả sẽ nghiêm trọng hơn nhiều vì thao tác đó sẽ làmhỏng các giá trị khác trên bộ nhớ

 Phương thức at(chỉ_số) có tác dụng tương tự như dùng ký hiệu [], nhưng có một sự khác biệt

là thao tác này có kiểm tra chỉ số hợp lệ

Bảng: các hàm thành viên lớp vector

Trang 8

2 Deques

Một deque (phát âm là "deck") là một biến dạng của một vector Nó trợ giúp truy cập ngẫunhiên dùng toán tử [] Tuy nhiên, không giống như một vector, một hàng đợi hai đầu có thể truynhập cả trước và sau Như vậy, một deque nhanh chóng cho phép chèn thêm và xóa bỏ ở cuối cảhai và bắt đầu

Để cung cấp khả năng này, deque được thực hiện thường là một bó của khối cá nhân, với khốiđầu tiên phát triển theo một hướng và chặn cuối cùng phát triển theo hướng ngược lại.

Trang 9

Để sử dụng một deque, bạn phải thêm một header #include <deque> và phải có using std::deque

2.1 Các khả năng của Deque

Deque có các khả năng khác biệt so với Vector:

 Chèn và loại bỏ các yếu tố là nhanh chóng cả ở đầu và cuối (đối với vectơ nó chỉ là nhanh ở cuối)

 Vòng lặp phải là một loại con trỏ đặc biệt hơn là con trỏ bình thường, vì nó phải nhảy giữacác khối khác nhau

 Trong hệ thống có giới hạn kích thước cho các khối bộ nhớ (ví dụ, một số máy tính hệthống), một deque có thể chứa các yếu tố hơn vì nó sử dụng nhiều hơn một khối bộ nhớ Vìvậy, max_size () có thể là lớn hơn cho deques

 Deques không cung cấp hỗ trợ để kiểm soát công suất và thời điểm của việc tái phân bổ Đặcbiệt, bất kỳ chèn hoặc xóa các yếu tố khác hơn là ở đầu hay cuối invalidates tất cả cácpointers, references, và iterator liên quan đến các yếu tố của deque này Tuy nhiên, phân bổlại có thể thực hiện tốt hơn cho các vector, bởi vì deques không cần phải sao chép tất cả cácyếu tố về phân bổ lại

 Khối bộ nhớ có thể nhận được giải thoát khi chúng không còn được sử dụng, do đó, kíchthước bộ nhớ của một deque có thể co lại

Các tính năng sau đây của vector cũng áp dụng cho deques:

 Chèn và xoá các phần tử ở giữa là tương đối chậm vì tất cả các yếu tố lên đến một trong haiđầu có thể được di chuyển để làm cho căn phòng hoặc để lấp đầy một khoảng cách

 Vòng lặp được iterators truy cập ngẫu nhiên

2.2 Hoạt động của Deque

Deque chỉ hoạt động khác với hoạt động của vector như sau:

 Deques không cung cấp các chức năng cho công suất (công suất () và dự trữ ())

 Deques làm trực tiếp cung cấp các chức năng để chèn và xoá các yếu tố đầu tiên(push_front() Và pop_front ())

Các hoạt động khác của deque và vector đều giống nhau

3 Lists

List trong STL là danh sách liên kết đôi Không giống như vector, hỗ trợ truy xuất một cáchngẫu nhiên (random access ), một danh sách chỉ có thể được truy xuất một cách tuần tự Nghĩa là

Trang 10

nếu bạn muốn truy xuất một phần tử bất kì trong list thì bạn phải bắt đầu duyệt từ phần tử đầutiên hoặc phần tử cuối cùng của list rồi duyệt lần lượt qua các iterator đến phần tử đó.

Con trỏ trước (front pointer) của phần tử đầu tiên và con trỏ sau (back pointer) của phần tửcuối cùng có giá trị NULL để báo hiệu hai đầu của danh sách

Liên kết các danh sách có lợi thế mà bạn có thể loại bỏ và các yếu tố chèn ở bất kỳ vị trítrong thời gian liên tục Nếu bạn di chuyển các yếu tố từ một container khác, lợi thế này tăng gấpđôi trong đó bạn chỉ cần chuyển hướng một số điểm nội bộ

Để hỗ trợ khả năng này, danh sách cung cấp không chỉ remove () mà còn bổ sung chức năngthành viên sửa đổi để thay đổi thứ tự và các yếu tố relink và phạm vi Bạn có thể gọi những hoạtđộng để di chuyển các yếu tố bên trong một danh sách đơn hoặc giữa hai danh sách, cung cấpdanh sách có cùng loại

Để sử dụng list, bạn phải khai báo file header list: #include <list>

List có thể khởi tạo bằng constructor mặc định hoặc sao chép từ mảng, từ list khác hay container khác

int a[10];

list<int> list0;

list<int> list1(a+2,a+7);

 Các hàm thường dùng của list:

 size(): Trả về số phần tử hiện có của danh sách

 empty(): Trả về 1 nếu danh sách rỗng, 0 nếu ngược lại

 max_size(): Trả về số lượng phần tử tối đa của danh sách

 front(): Trả về phần tử ở đầu danh sách

 back(): Trả về phần tử ở cuối danh sách

 begin(): Trả về phần tử lặp đầu tiên của danh sách

 end(): Trả về phần tử lặp cuối cùng của danh sách

 push_front(): Đưa một phần tử vào đầu danh sách

 push_back(): Đưa một phần tử vào cuối danh sách

 pop_front(): Lấy phần tử đầu tiên ra khỏi danh sách

 pop_back: Lấy phần tử cuối cùng ra khỏi danh sách

 reverse(): Đảo ngược danh sách

 merge(): Trộn một danh sách vào một danh sách khác

 unique(): Làm cho mỗi phần tử trong danh sách là duy nhất

 insert(): Chèn một phần tử vào danh sách

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

TỪ KHÓA LIÊN QUAN

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

w