Stl – PDFCOFFEE.COM

Citation preview

STL(Standard Template Library ) |1

TỔNG QUAN VỀ THƯ VIỆN CHUẨN STL

I. GIỚI THIỆU 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ái quát, không cụ thể và chi tiết như nhiều ngôn ngữ khác. Sức mạnh của C++ đến từ STL, viết tắt của Standard Template Library – một thư viện template 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 template, những người lập trình đã đề ra khái niệm lập trình khái lược (generic programming), C++ được cung cấp kèm với bộ thư viện chuẩ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: o Sequential container (các ctdl tuần tự) bao gồm list, vector và deque o 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 … 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: o container adapter (các bộ tương thích lưu trữ) bao gồm stack, queue và priority_queue o iterator adapter (các bộ tương thích con trỏ) o 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 để cung cấ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ấ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. 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ậ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ôn ngữ 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ả hai mô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ện chuẩn được thiết kế bởi những chuyện gia hàng đầu và đã được chứng minh tính hiệ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 được khuyến cáo sử dụng thay vì dùng những phần viết tay bên ngoài hay những phương tiện cấp thấp khác. Thí dụ, dùng std::vector hay std::string thay vì dùng kiể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; Dưới đây ta sẽ tìm hiểu từng thành phần của STL

STL(Standard Template Library ) |2 II. NHẬP XUẤT VỚI IOSTREAM Như chúng ta sẽ thấy, C++ sử dụng nhập/xuất kiểu an toàn (type safe). Việc nhập/xuất được thực hiện một cách tự động theo lối nhạy cảm về kiểu dữ liệu. Mỗi thao tác nhập xuất có được định nghĩa thích hợp để xử lý một kiểu dữ liệu cụ thể thì hàm đó được gọi để xử lý kiểu dữ liệu đó. Nếu không có đối sánh giữa kiểu của dữ liệu hiện tại và một hàm cho việc xử lý kiểu dữ liệu đó, một chỉ dẫn lỗi biên dịch được thiết lập. Vì thế dữ liệu không thích hợp không thể “lách” qua hệ thống. Các đặc tính nhập xuất mô tả theo hướng đối tượng. Người dùng có thể chỉ định nhập/xuất của các kiểu dữ liệu tự định nghĩa cũng như các kiểu dữ liệu chuẩn. Khả năng mở rộng này là một trong các đặc tính quan trọng của C++. 1.CÁC LỚP STREAM C++ sử dụng khái niệm dòng tin (stream) và đưa ra các lớp dòng tin để tổ chức việc nhập xuất. Dòng tin có thể xem như một dẫy các byte. Thao tác nhập là lấy (đọc) các byte từ dòng tin (khi đó gọi là dòng nhập – input) vào bộ nhớ. Thao tác xuất là đưa các byte từ bộ nhớ ra dòng tin (khi đó gọi là dong xuất – output). Các thao tác này là độc lập thiết bị. Để thực hiện việc nhập, xuất lên một thiết bị cụ thể, chúng ta chỉ cần gắn dòng tin với thiết bị này. Khái nệm stream:

–chuỗi byte, kết thúc bởi ký hiệu end_of_file – Input: từ bàn phím, đĩa… vào bộ nhớ – Output: từ bộ nhớ ra màn hình, máy in… – file cũng được coi là một dòng Lớp streambuf là cơ sở cho tất cả các thao tác vào ra bằng toán tử, nó định nghĩa các đặc trưng cơ bản của các vùng đệ m lưu trữ các ký tự để xuất hayn hập. Lớp ios là lớp dẫn xuất từ streambuf , ios đị nh nghĩa các dạng cơ bản và khả năng kiểm tra lỗi dùng cho streambuf . ios là lớp cơ sở ảo cho các lớp istream và ostream. Mỗi lớp này có định nghĩa chồng toán tử “ > ” cho các kiểu dữ liệ u cơ sở khác nhau. Có 4 lớp quan trọng cần nhớ là: + Lớp cơ sở ios + Từ lớp ios dẫn xuất đến 2 lớp istream và ostream + Hai lớp istream và ostream lại dẫn xuất tới lớp iostream Sơ đồ kế thừa giữa các lớp như sau:

STL(Standard Template Library ) |3 –

Lớp ios + Thuộc tính của lớp: Trong lớp ios định nghĩa các thuộc tính được sử dụng làm các cờ định dạng cho việc nhập xuất và các cờ kiểm tra lỗi (xem bên dưới). + Các phương thức: Lớp ios cung cấp một số phương thức phục vụ việc định dạng dữ liệu nhập xuất, kiểm tra lỗi (xem bên dưới).

Lớp istream Lớp này cung cấp toán tử nhập >> và nhiều phương thức nhập khác (xem bên dưới) như các phương thức: get, getline, read, ignore, peek, seekg, tellg,…

Lớp ostream Lớp này cung cấp toán tử xuất > VÀ > chỉ tiện lợi khi dùng để nhập các giá trị số (nguyên, thực). Để nhập ký tự và chuỗi ký tự nên dùng các phương thức sau (định nghĩa trong lớp istream): istream::get(); istream::getline(); istream::ignore(); 3.1. Phương thức get Có 3 dạng (thực chất có 3 phương thức cùng có tên get):

STL(Standard Template Library ) |4 Dạng 1: int istream::get() ; Cách thức đọc của get() có thể minh hoạ qua ví dụ sau: char ch; ch = cin.get(); + Nếu gõ ABC thì biến ch nhận mã ký tự A, các ký tự BC còn lại trên dòng vào. + Nếu gõ A thì biến ch nhận mã ký tự A, ký tự còn lại trên dòng vào. + Nếu gõ thì biến ch nhận mã ký tự (bằng 10) và dòng vào rỗng. Dạng 2: istream& istream::get(char &ch) ; char được tham chiếu bởi ch. Chú ý: + Cách thức đọc của get dạng 2 cũng giống như dạng 1 + Do get() dạng 2 trả về tham chiếu tới istream, nên có thể sử dụng các phương thức get() dạng 2 nối đuôi nhau và cũng có thể kết hợp với toán tử >>. Ví dụ: cin.get(ch1); cin.get(ch2); cin.get(ch3); có thể viết chung trên một câu lệnh sau: cin.get(ch1).get(ch2) >> ch3; Dạng 3: istream& istream::get(char *str, int n, char delim = \n); Dùng để đọc một dẫy ký tự (kể cả khoảng trắng) và đưa vào vùng nhớ do str trỏ tới. Quá trình đọc kết thúc khi xẩy ra một trong 2 tình huống sau: + Gặp ký tự giới hạn (cho trong delim). Ký tự giới hạn mặc định là \n (Enter) + Đã nhận đủ (n-1) ký tự Chú ý: + Ký tự kết thúc chuỗi \0 được bổ sung vào dẫy ký tự nhận được + ký tự giới hạn vẫn còn lại trên dòng nhập để dành cho các lệnh nhập tiếp theo. + Cũng giống như get() dạng 2, có thể viết các phương thức get() dạng 3 nối đuôi nhau trên một dòng lệnh, và cũng có thể kết hợp với toán tử >> + Ký tự còn lại trên dòng nhập có thể làm trôi phương thức get() dạng 3. Ví dụ xét đoạn chương trình: char ht[25], qq[20], cq[30]; cout