Hỏi về sự khác nhau của string và mảng char và nên dùng cái nào?

Em đang ôn lại C++.
Cho em hỏi string và mảng char khác nhau như thế nào?
Khi làm bài tập về xâu thì nên dùng mảng char hay String? Dùng cái nào tối ưu hơn (tgian chạy)?

1 Like

Theo mình hiểu thì.
Nếu mảng mà bạn dùng string thì sẽ lưu được từ hoặc chuỗi ví dụ như string arrayString = [mot, hai, ba]
Sẽ có 2 phần tử trong mảng trên.
Nếu mảng mà bạn dùng char thì chỉ lưu được ký tự mà thôi ví dụ như char arrayChar = [m,o,t,h,a,i,b,a]
Sẽ có 7 phần từ trong mảng trên.

Còn làm bài tập thì theo như trên mà bạn quyết định.

1 Like

^ Làm gì có chuyện đó.

Bạn viết code mới thì dùng std::string thôi.

Vả lại std::string có khả năng:

  • Đọc độ dài nhanh (một số tác vụ được tăng tốc)
  • Truy cập ngẫu nhiên
    - Tự co giãn
    - Tự tiêu
  • So sánh bằng toán tử < > =
  • Có thể feed vào lib C với method c_str()

Lưu ý: Khi bạn ráp chuỗi nên dùng std::stringstream.vì mỗi std::string có tối thiểu (overhead) 24 byte. http://jovislab.com/blog/?p=76

4 Likes

Em cảm ơn.
Vậy cho em hỏi thêm chút nữa.

Trong Đây có viết một bài về các hàm xử lý xâu.

Thao tác về xâu (copy, ins, del, rev), giữa string và mảng char cái nào đơn giản hơn, Ok hơn, an toàn hơn?

C string: em phải biết kích cỡ của mảng ký tự, phải nhớ chèn null vào cuối chuỗi
std::string: vô tư

copy:

std::string s1 = "hello";
std::string s2;
s2 = s1; //copy s1 vào s2

insert:

std::string s1 = "hello ";
std::string s2 = "world";
s1 += s2; //insert s2 vào s1

insert nhanh:

std::ostringstream oss;
oss << "hello" << " " << "world" << "!" << "\n";
std::string s = oss.str(); //s = "hello world!\n"

xóa toàn bộ chuỗi

s.clear();

xóa 1 phần chuỗi

std::string s = "daynhauhoc"
s.erase(3, 4); //xóa từ index thứ 3 nghĩa là từ chữ 'n', xóa 4 ký tự, s còn lại "dayhoc"

đảo chuỗi:

std::string s = "hello";
std::reverse(begin(s), end(s)); //s trở thành "olleh"
3 Likes

Em cảm ơn.
Cho e sửa lại code của anh 1 chút.

std::reverse(begin(s), end(s)); //s trở thành "olleh"

sửa lại là:

std::reverse(s.begin(), s.end()); //s trở thành "olleh"

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?