S TL( S t a n d a r d Te m p l a t e Li b r a r y ) | 1
TNG QUAN V THƯ VIỆN CHUN STL
I. GII THIỆU THƯ VIỆN CHUN STL
C++ được đánh giá là ngôn ngữ mnh vì tính mm do, gn gũi vi ngôn ng máy. Ngoài ra, vi khả năng lập trình
theo mu ( template ), C++ đã khiến ngôn ng lp 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. Sc mnh của C++ đến t STL, viết tt ca Standard Template Library - một thư vin template cho C++
vi nhng cu trúc d liu cũng như giải thut được xây dng tng quát mà vn tn dụng được hiu năng và tốc độ
ca C. Vi khái nim template, những ngưi lp trình đã đề ra khái nim lp trình khái lược (generic programming),
C++ được cung cp kèm vi b t viện chun STL.
STL gồm các thành phn chính:
Container (các blưu trữ dữ liệu) là các cấu trúc dữ liệu phbiế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 loi:
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 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 btươ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 gm 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 phn tử, tìm kiếm (tìm kiếm
thường và tìm kiếm nhị phân), trộn. Toàn bcá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ờ vy, 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 tviện này trong xlý thuận tiện cho việc chia sẽ mã ngun với cộng đồng phát triển.
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 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. Tdụ, 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 hiu tng thành phn ca STL
S TL( S t a n d a r d Te m p l a t e Li b r a r y ) | 2
II. NHP XUT VI IOSTREAM
Như chúng ta s thy, C++ s dng nhp/xut kiu an toàn (type safe). Vic nhp/xuất được thc hin mt cách t
động theo li nhy cm v kiu d liu. Mi thao tác nhp xuất có được đnh nghĩa thích hợp để x lý mt kiu d
liu c th thì hàm đó đưc gọi để x lý kiu d liệu đó. Nếu không có đối sánh gia kiu ca d liu hin ti và mt
hàm cho vic x lý kiu d liệu đó, một ch dn li biên dịch được thiết lp. Vì thế d liu không thích hp không th
"lách" qua h thng.
Các đặc tính nhp xut mô t theo hướng đối tượng. Người dùng có th chỉ định nhp/xut ca các kiu d liu t
định nghĩa cũng như các kiu d liu chun. Khả năng m rng này là một trong các đặc tính quan trng ca C++.
1.CÁC LP STREAM
C++ s dng khái nim dòng tin (stream) và đưa ra các lp dòng tin để t chc vic nhp xut. Dòng tin có th
xem như mt dy các byte. Thao tác nhp là lấy (đọc) các byte t dòng tin (khi đó gọi là dòng nhp - 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 xut - output). Các thao tác này là
độc lp thiết b. Để thc hin vic nhp, xut lên mt thiết b c th, chúng ta ch cn gn dòng tin vi thiết b này.
Khái nm stream:
– chui byte, kết thúc bi ký hiu 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à mt dòng
Lớp streambuf là cơ sở cho tất cả các thao tác vào ra bng toán tử, định nghĩa các đặc trưng cơ bản ca 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
bản và kh 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ử “ << ” và “ >> ” cho các kiểu dữ li u cơ sở khác nhau.
4 lp quan trng cn nh:
+ Lớp cơ sở ios
+ T lp ios dn xuất đến 2 lp istream và ostream
+ Hai lp istream và ostream li dn xut ti lp iostream
Sơ đồ kế tha gia các lớp như sau:
S TL( S t a n d a r d Te m p l a t e Li b r a r y ) | 3
- Lp ios
+ Thuc tính ca lp: Trong lớp ios định nghĩa các thuộc tính được s dng làm các cờ định dng cho vic
nhp xut và các c kim tra li (xem bên dưới).
+ Các phương thức: Lp ios cung cp mt số phương thức phc v việc định dng d liu nhp xut, kim
tra li (xem bên dưi).
- Lp istream
Lp này cung cp toán t nhp >> và nhiều phương thức nhp khác (xem bên dưới) như các phương thức:
get, getline, read, ignore, peek, seekg, tellg,...
- Lp ostream
Lp này cung cp toán t xut << và nhiều phương thức xut khác (xem bên dưới) như các phương thức:
put, write, flush, seekp, tellp,...
- Lp iostream
Lp này tha kế các phương thức nhp xut ca các lp istream và ostream.
Thư vin iostream ca C++ cung cấp hàng tm khả năng của nhp/xut. Mt vài tp tin header cha các phn
ca giao din thư vin:
- Phn ln chương trình C++ thường include tp tin header <iostream> mà cha các thông tin cơ bản đòi hi
tt c các thao tác dòng nhp/xut:
• dòng nhp chun ni vi thiết b nhp chun – Standard input (cin)
• dòng xut chun ni vi thiết b xut chun – Standard output (cout)
• dòng báo li - ni vi thiết b báo li chun:
Không có b nhớ đệm ( unbuffered error ) cerr
Có dùng b nhớ đệm ( buffered error ) clog
- Header <iomanip> cha thông tin hu ích cho vic thc hin nhp/xuất định dng vi tên gi là các b x
dòng biu hin bng tham s (parameterized stream manipulators).
- Header <fstream> cha các thông tin quan trng cho các thao tác xfile do người dùng kim soát.
- Header <strstream> cha các thông tin quan trng cho vic thc hiện các đnh dng trong b nhớ. Điều này
tương t x lý file, nhưng các thao tác nhp/xut ti và t mng các ký t hơn là file.
- Header <stdiostream.h> kết hp kiu nhp/xut cũ ca C vi C++ theo hướng đối tượng.
2. NHP XUẤT CƠ BẢN VÓI TOÁN T >> VÀ <<
3. NHP KÝ T VÀ CHUI KÝ T
Chúng ta nhn thy toán t nhp >> ch tin lợi khi dùng để nhp các giá tr s (nguyên, thc). Để nhp ký t
và chui 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
3 dng (thc cht có 3 phương thức cùng có tên get):
S TL( S t a n d a r d Te m p l a t e Li b r a r y ) | 4
Dng 1: int istream::get() ;
Cách thức đọc ca get() th minh ho qua ví d sau:
char ch;
ch = cin.get();
+ Nếu gõ ABC<Enter>
thì biến ch nhn mã ký t A, các ký t BC<Enter> còn li trên dòng vào.
+ Nếu gõ A<Enter>
thì biến ch nhn mã ký t A, ký t <Enter> còn li trên dòng vào.
+ Nếu gõ <Enter>
thì biến ch nhn mã ký t <Enter> (bng 10) và dòng vào rng.
Dng 2: istream& istream::get(char &ch) ;
char được tham chiếu bi ch.
Chú ý:
+ Cách thức đọc ca get dng 2 cũng giống như dạng 1
+ Do get() dng 2 tr v tham chiếu ti istream, nên có th s dụng các phương thức get() dng 2 ni
đuôi nhau và cũng có thể kết hp vi toán t >>. Ví d:
cin.get(ch1); cin.get(ch2); cin.get(ch3);
có th viết chung trên mt câu lnh sau: cin.get(ch1).get(ch2) >> ch3;
Dng 3: istream& istream::get(char *str, int n, char delim = \n);
Dùng để đọc mt dy ký t (k c khong trng) và đưa vào vùng nhớ do str tr ti. Quá trình
đọc kết thúc khi xy ra mt trong 2 tình hung sau:
+ Gp ký t gii hn (cho trong delim). Ký t gii hn mặc định là \n (Enter)
+ Đã nhận đủ (n-1) ký t
Chú ý:
+ Ký t kết thúc chui \0 được b sung vào dy ký t nhận được
+ ký t gii hn vn còn li trên dòng nhập để dành cho các lnh nhp tiếp theo.
+ Cũng giống như get() dng 2, có th viết các phương thức get() dng 3 ni đuôi nhau trên một dòng
lnh, và cũng có thể kết hp vi toán t >>
+ Ký t <Enter> còn li trên dòng nhp có thlàm trôi phương thức get() dng 3. Ví d xét đoạn chương
trình:
char ht[25], qq[20], cq[30];
cout << “\nH tên: ;
cin.get(ht,25);
cout << “\nQuê quán:;
cin.get(qq,20);
cout << “\nCơ quan: ;
cin.get(cq,30);
cout <<”\n” <<ht<<” “<<qq<<<<cq;
Đoạn chương trình dùng để nhp họ tên, quê quán và cơ quan. Nếu:
Pham Thu Huong<Enter>
S TL( S t a n d a r d Te m p l a t e Li b r a r y ) | 5
thì câu lnh get() đầu tiên s nhận được chui “Pham Thu Huong” ct vào mng ht. Ký t <Enter> còn li
s làm trôi 2 câu lnh get tiếp theo. Do đó câu lệnh cui cùng s ch in ra Pham Thu Huong.
Để khc phc tình trng trên, có th dùng mt trong các cách sau:
+ Dùng phương thức get() dng 1 hoc dng 2 để ly rat <Enter> trên dòng nhập trước khi
dùng get (dng 3).
+ Dùng phương thức ignore để ly ra mt s ký t không cn thiết trên dòng nhập tc khi dùng
get dng 3.
cin.ignore(n) ; // Ly ra (loi ra hay b qua) n ký t trên dòng nhp.
Như vậy để có th nhập được cả quê quán và cơ quan, cần sa li đoạn chương trình trên như sau:
char ht[25], qq[20], cq[30];
cout << “\nH tên: ;
cin.get(ht,25);
cin.get(); // Nhn <Enter>
cout << “\nQuê quán:;
cin.get(qq,20);
cin.ignore(1); // B qua <Enter>
cout << “\nCơ quan: ;
cin.get(cq,30);
cout <<”\n” <<ht<<” “<<qq<<<<cq;
3.2. Phương thức getline
Tương tự như get dạng 3, có thể dùng getline để nhp mt dy ký t t bàn phím. Phương thức này
được mô tả như sau:
istream& istream::getline(char *str, int n, char delim = \n);
Phương thức đầu tiên làm việc như get dạng 3, sau đó nó loại <Enter> ra khi dòng nhp (ký t <Enter>
không đưa vào dẫy ký t nhận đưc). Như vy có th dùng getline để nhp nhiu chui ký t (mà không
lo ngi các câu lnh nhp tiếp theo b trôi).
Ví dụ đoạn chương trình nhp họ tên, quê quán và cơ quan bên trên có thể viết như sau (bng
cách dùng getline):
char ht[25], qq[20], cq[30];
cout << “\nH tên: ;
cin.getline(ht,25);
cout << “\nQuê quán:;
cin.getline(qq,20);
cout << “\nCơ quan: ;
cin.get(cq,30);
cout <<”\n” <<ht<<” “<<qq<<<<cq;
Chú ý: Cũng giống như get() dng 2 và get() dng 3, có th viết các phương thức getline() ni đuôi nhau
trên mt dòng lnh hoc kết hp vi toán t >>
3.3. Nhập đồng thi giá tr s và ký t
Như đã nói trong 2, toán t nhp >> bao gi cũng để li ký t <Enter> trên dòng nhp. Ký t <Enter>
này s làm trôi các lnh nhp ký t hoc chui ký t bên dưới. Do vy cn dùng: