Sự khác biệt giữa std :: string và std :: basic_string là gì? Và tại sao cả hai đều cần thiết?


94

Sự khác biệt giữa std::stringvà là std::basic_stringgì? Và tại sao cả hai đều cần thiết?

Câu trả lời:


63

std::basic_stringlà một mẫu lớp để tạo chuỗi ngoài các kiểu ký tự, std::stringlà một mẫu typedefdành cho chuyên môn hóa của mẫu lớp đó char. Có, cả hai đều cần thiết (hoặc ít nhất là theo yêu cầu của tiêu chuẩn).


17
tại sao cả hai đều cần thiết?
Mohamed El-Nakib

1
vì vậy bạn đang nói rằng std :: string là typedef std :: basic_string <char> std :: string?
unresolved_external

1
@MuhammadAnnaqeeb trễ 2,5 năm nhưng câu trả lời ngắn gọn là cung cấp hỗ trợ chuỗi rộng (wstring) (Unicode, 2 byte mỗi ký tự, wchar_t).
Andrew

46

std::stringlà một mô tả của std::basic_string<T>:

typedef std::basic_string<char> string

std::basic_stringlà cần thiết để có một giao diện tương tự cho tất cả các loại chuỗi ( wstringví dụ).


33
Thuật ngữ thích hợp là "chuyên môn hóa". stringlà một chuyên ngành của basic_string.
AnT

3
Tôi đoán bạn có thể tranh luận về điều đó. "specialization" thường được dùng để chỉ sự kế thừa. Một {class | function} được tạo mẫu được khởi tạo bằng cách thay thế các đối số mẫu. Có một phần chuyên môn hóa mẫu nhưng điều này không được sử dụng ở đây.
pmr

5
Đề cập đến một lớp dẫn xuất như một 'chuyên môn hóa' là một cách sử dụng ít chính thức hơn của 'chuyên môn hóa'. Từ 'chuyên môn hóa' hoàn toàn không được sử dụng như thế này trong tiêu chuẩn (tôi khá chắc chắn), nhưng nó được sử dụng rộng rãi để mô tả chuyên môn hóa mẫu. Tên của một chuyên ngành mẫu có thể được sử dụng trong các ngữ cảnh không bắt buộc và ngầm định, vì vậy chuyên môn hóa và khởi tạo là các khái niệm riêng biệt. Cũng như chuyên môn hóa mẫu (tên của mẫu với một bộ tham số cụ thể), cũng có các chuyên môn hóa từng phần (chỉ dành cho các mẫu lớp) và các chuyên môn hóa rõ ràng.
CB Bailey

1
Sử dụng "chuyên môn hóa" ở đây sẽ gây hiểu lầm. Một chuyên môn hóa mẫu có một ý nghĩa cụ thể (không liên quan đến kế thừa), nhưng đó KHÔNG phải là những gì được sử dụng ở đây. std :: string không hơn không kém so với typedef, như: namespace std { typedef basic_string<char> string; }Về mặt kỹ thuật, nó cũng không thực sự là một trình khởi tạo, nhưng ít nhất nó gần giống hơn (theo định nghĩa, việc tạo ra một thể hiện, và một typedef chỉ tạo ra một cái tên chứ không phải một thể hiện ).
Jerry Coffin

3
@Charles: nó gây hiểu lầm bởi vì (với các mẫu), "chuyên môn hóa" thường đề cập đến chuyên môn hóa từng phần hoặc chuyên môn hóa rõ ràng, không phải là định dạng cho những gì sẽ kết thúc như một trình diễn giải đơn giản.
Jerry Coffin

17

A std::stringlà phần khởi tạo của std::basic_stringmẫu với kiểu char. Bạn cần cả hai để có thể tạo chuỗi những thứ bên cạnh đó char, chẳng hạn như std::basic_string<wchar_t>chuỗi ký tự rộng. Hoặc nếu bạn muốn một chuỗi có các phần tử 32 bit std::basic_string<unsigned int>,.


2
Tôi nghĩ đây phải là câu trả lời được bình chọn hàng đầu. Nó cung cấp một trường hợp sử dụng về thời điểm bạn sẽ không khởi tạo std::basic_stringmà không có charkiểu.
hlin117
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.