Các Hàm Thao TácThông Th ờng Trong C: int strlenconst char* s Xác định độ dài một chuỗi char toupperchar c Chuy ển đổi một ký tự thường thành ký tự hoa char* struprchar *s Chuy ển đổi
Trang 1L ớp String trong STL
Chu ỗi là một hàng gồm các kí tự liên tục nhau, các kí tự ở đây rất đa
d ạng có thể là chữ số, chữ cái, dấu cách, kí hiệu… số l ợng kí tự rất lớn(216
kí t ự) và kết thúc bằng kí tự ‘\0’
Các Hàm Thao TácThông Th ờng Trong C:
int strlen(const char* s) Xác định độ dài một chuỗi
char toupper(char c) Chuy ển đổi một ký tự thường thành ký tự hoa
char* strupr(char *s) Chuy ển đổi chuỗi chữ thường thành chuỗi chữ hoa
char *strlwr(char *s) Chuy ển đổi chuỗi chữ hoa thành chuỗi toàn chữ thường
char *strncpy(char *Des, const char
*Source, size_t n)
Chép n ký t ự đầu tiên của chuỗi nguồn sang chuỗi đích
char* strstr(const char *s1, const char
*s2)
Tìm ki ếm sự xuất hiện đầu tiên của chuỗi s2 trong chuỗi
s1 int strcmp(const char *s1, const char *s2) Hai chu ỗi s1 và s2 được so sánh với nhau, kết quả trả về
là m ột số nguyên(0;1;-1)
int strcmp(const char*s1, const char *s2) So sánh trong n ký t ự đầu tiên của 2 chuỗi s1 và s2
memset(char *Des, int c, size_t n) Đặt n ký tự đầu tiên của chuỗi là ký tự c
int atoi(const char *s) Chuy ển chuỗi thành số nguyên
long atol(const char *s) Chuy ển chuỗi thành số nguyên dài
float atof(const char *s) Chuy ển chuỗi thành số thực
Trang 2Nh ợc điễm dễ thấy là các hàm này là chỉ thao tác trên một chuỗi và khi thao
tác nhiều chuỗi thì công việc rất phức tạp, ngoài ra nó con một vài rắc rối nữa
là:
- Phải chủ động kiểm soát bộ nhớ cấp phát cho chuỗi ký tự
- Không thể gán giá trị hay sử dụng phép toán cộng(+),trừ(-),nhân(*),chia(/)
- Nếu dùng kỹ thuật cấp phát động thì phải quán xuyến việc cấp thêm bộ nhớ khi
chu ỗi dãn ra và phải hủy bộ nhớ (khi không dùng nữa) để tiết kiệm bộ nhớ
Chính vì v ậy mà trong C++ ngoài khả năng s ử dụng các hàm của C trong
chu ỗi thì nó còn có STL (Standard Template Library) h ỗ trợ việc lập trình với
chu ỗi dễ dàng hơn
Để sử dụng th viện string chúng ta cần khai báo #include <string>
a) Các phép toán và ph ơng thức cơ bản
Phép c ộng (+)
s=str1+str2;
Ghép hai chu ỗi và cũng để ghép một ký tự vào chuỗi
Các phép so sánh (==; !=; < ;> ; >= ;<=) So sánh theo th ứ tự từ điển
length( ) và phép l ấy chỉ số [ ] Duy ệt từng ký tự của chuỗi
Phép gán (=) Gán string b ằng một hằng chuỗi
substr(int pos, int nchar) Trích ra chu ỗi con của một chuỗi cho trước
insert( ) Chèn thêm ký t ự hay chuỗi vào một vị trí nào đó của chuỗi
str cho trước 1/str.insert(int pos, char* s) chèn s vào v ị trí pos của str; 2/str.insert(int pos, string s) chèn chu ỗi s vào vị trí pos của chu ỗi str;
3/str.insert(int pos, int n, int ch) chèn n l ần ký tự ch vào vị trí pos c ủa chuỗi str;
str.erase(int pos, int n) Xóa n ký t ự của chuỗi str kể từ vị trí pos
Trang 3VD1/
// Ghép chuỗi
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string name ( "John" );
string family ( "Smith" );
name += " K " ; // c-string
name += family; // string
name += '\n' ; // character
cout << name;
return 0;
}
VD2/
// Xóa kí tự trong chuỗi
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string str ( "This is an example phrase." );
string::iterator it;
// erase used in the same order as described above:
str.erase (10,8);
cout << str << endl; // "This is an phrase."
it=str.begin()+9;
str.erase (it);
cout << str << endl; // "This is a phrase."
str.erase (str.begin()+5, str.end()-7);
cout << str << endl; // "This phrase."
return 0;
}
Trang 4b) Tìm kiếm và thay thế
find( ) Ki ếm xem một ký tự hay một chuỗi nào đó có xuất hiện trong một chuỗi cho tr ớc hay
không
1/str.find(int ch, int pos = 0) tìm ký t ự ch kể từ vị trí pos đến cuối chuỗi str 2/str.find(char *s, int pos = 0) tìm s (m ảng ký tự kết thúc ‘\0’) kể từ vị trí pos đến cuối 3/str.find(string& s, int pos = 0) tìm chuỗi s kể từ vị trí pos đến cuối chuỗi
replace( ) Thay th ế một đoạn con trong chuỗi str cho tr ớc
str.replace(int pos, int nchar, char *s);
str.replace(int pos, int nchar, string s);
str.replace(int pos, int nchar, int n, int ch);
VD/
// Tìm trong chuỗi
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string str ( "There are two needles in this haystack with needles." );
string str2 ( "needle" );
size_t found;
// different member versions of find in the same order as above:
found=str.find(str2);
if (found!=string::npos)
cout << "first 'needle' found at: " << int(found) << endl;
found=str.find( "needles are small" ,found+1,6);
if (found!=string::npos)
cout << "second 'needle' found at: " << int(found) << endl;
found=str.find( "haystack" );
if (found!=string::npos)
cout << "'haystack' also found at: " << int(found) << endl;
found=str.find( '.' );
if (found!=string::npos)
cout << "Period found at: " << int(found) << endl;
// let's replace the first needle:
str.replace(str.find(str2),str2.length(), "preposition" );
cout << str << endl;
return 0;
}
Trang 5Ghi chú: bài vi ết có trích một vài thông tin từ các nguồn sau:
Bài đọc thêm cho môn Lập trình HĐT với C++(Thầy Trần Đan Th )
Nhập môn lập trình(KHTN)
Wikipedia.org
Một Vài ví dụ đ ợc trích từ cplusplus.com
L ớp Vector trong STL
Đối t ợng vector giống nh một mảng thông th ờng, có thể truy xuất qua
ch ỉ mục[], tuy nhiên nó có thể mở rộng kích th ớc tùy ý
M ột số ph ơng thức trong lớp vector:
clear() Xóa t ất cả các phần tử trong mảng
empty() Ki ểm tra mảng rỗng hay không
earse() Xóa m ột hoặc một dãy các phần tử
front(),back() Tr ả vê phần tử đầu(cuối) của mảng
insert() Thêm m ột phần tử vào vị trí bất kì
pop_back();push_back() Xóa, thêm m ột phần tử vào phía sau mảng
reserve() C ấp phát sẵn một bộ nhớ tối thiểu
size() Tr ả về kích th ớc của mảng
resize() Điều chỉnh lại kích th ớc của mảng
Các ưu điểm/nhược điểm:
u điểm: mang bản chất là mảng nên việc truy xuất ngẩu nhiên nhanh
chóng
Trang 6 Nh ợc điểm: khi chèn m ột đối t ợng vào v ị trí bất kì (tr ừ vị trí cuối) khá khó khăn Khi m ảng đầy h ệ thống sẽ gọi t ạo vùng nhớ m ới và chép các đối
t ợng của mảng đư đầy vào mảng mới sau đó sẽ xóa m ảng đầy này nên hàm
o Nếu biết tr ớc kích th ớc mảng thì lúc đầu thì sẽ gọi cấp một vùng
nh ớ có kích th ớc nh yêu cầu
o Còn không thì có thể sử dụng một lớp khác t ơng tự nh lớp dqeue
cho phép thêm ph ần tử ở hai đầu, tuy nhiên tốc đỗ sẽ chậm hơn