ความแตกต่างระหว่าง std :: string และ std :: basic_string? และทำไมทั้งสองจึงจำเป็น?


94

อะไรคือความแตกต่างระหว่างstd::stringและstd::basic_string? และทำไมทั้งสองจึงจำเป็น?

คำตอบ:


63

std::basic_stringเป็นแม่แบบสำหรับการทำชั้นสตริงออกจากรูปแบบตัวอักษร, std::stringเป็นสำหรับความเชี่ยวชาญของแม่แบบคลาสที่หาtypedef charใช่จำเป็นต้องใช้ทั้งคู่ (หรืออย่างน้อยก็กำหนดตามมาตรฐาน)


17
ทำไมทั้งคู่ถึงต้องการ?
Mohamed El-Nakib

1
ดังนั้นคุณกำลังบอกว่า std :: string คือ typedef std :: basic_string <char> std :: string?
unresolved_external

2
@MuhammadAnnaqeeb ช้าไป 2.5 ปี แต่คำตอบสั้น ๆ คือให้การสนับสนุนสตริงกว้าง (wstring) (Unicode, 2 ไบต์ต่ออักขระ, wchar_t) เช่นกัน
Andrew

47

std::stringเป็นอินสแตนซ์ของstd::basic_string<T>:

typedef std::basic_string<char> string

std::basic_stringจำเป็นต้องมีอินเทอร์เฟซที่คล้ายกันสำหรับสตริงทุกประเภท ( wstringเช่น)


33
คำที่เหมาะสมคือ "ความเชี่ยวชาญพิเศษ" stringเป็นความเชี่ยวชาญของbasic_string.
AnT

3
ฉันเดาว่าคุณสามารถโต้แย้งเกี่ยวกับเรื่องนี้ได้ "ความเชี่ยวชาญพิเศษ" มักใช้เพื่อบ่งบอกถึงการถ่ายทอดทางพันธุกรรม {class | function} แบบเทมเพลถูกสร้างอินสแตนซ์โดยการแทนที่อาร์กิวเมนต์ของเทมเพลต มีความเชี่ยวชาญด้านเทมเพลตบางส่วน แต่ไม่ได้ใช้ที่นี่
พีเอ็ม

5
การอ้างถึงคลาสที่ได้รับมาเป็น 'ความเชี่ยวชาญพิเศษ' เป็นการใช้ 'ความเชี่ยวชาญ' อย่างเป็นทางการน้อยกว่า คำว่า 'ความเชี่ยวชาญพิเศษ' ไม่ได้ใช้แบบนี้เลยในมาตรฐาน (ฉันค่อนข้างแน่ใจ) แต่ใช้อย่างกว้างขวางเพื่ออธิบายความเชี่ยวชาญของเทมเพลต ชื่อของความเชี่ยวชาญพิเศษของเทมเพลตสามารถใช้ในบริบทที่ไม่บังคับและการสร้างอินสแตนซ์โดยปริยายดังนั้นความเชี่ยวชาญและการสร้างอินสแตนซ์จึงเป็นแนวคิดที่แยกจากกัน เช่นเดียวกับความเชี่ยวชาญพิเศษของเทมเพลต (ชื่อของเทมเพลตที่มีชุดพารามิเตอร์เฉพาะ) นอกจากนี้ยังมีความเชี่ยวชาญบางส่วน (เทมเพลตคลาสเท่านั้น) และความเชี่ยวชาญเฉพาะด้านอย่างชัดเจน
CB Bailey

1
การใช้ "ความเชี่ยวชาญพิเศษ" ที่นี่อาจทำให้เข้าใจผิด ความเชี่ยวชาญพิเศษของเทมเพลตมีความหมายเฉพาะ (ไม่เกี่ยวข้องกับการสืบทอด) แต่นั่นไม่ได้ใช้ที่นี่ std :: string ไม่มีอะไรมากหรือน้อยไปกว่า typedef เช่น: ในnamespace std { typedef basic_string<char> string; }ทางเทคนิคแล้วมันไม่ใช่อินสแตนซ์จริงๆ แต่อย่างน้อยก็ใกล้กว่า (อินสแตนซ์ตามคำนิยามสร้างอินสแตนซ์และ typedef จะสร้างชื่อเท่านั้นไม่ใช่อินสแตนซ์ ).
Jerry Coffin

3
@ ชาร์ลส์: มันทำให้เข้าใจผิดเพราะ (ด้วยเทมเพลต) โดยปกติ "ความเชี่ยวชาญพิเศษ" หมายถึงความเชี่ยวชาญเฉพาะบางส่วนหรือความเชี่ยวชาญที่ชัดเจนไม่ใช่ตัวพิมพ์สำหรับสิ่งที่จะลงท้ายด้วยการสร้างอินสแตนซ์ง่ายๆ
Jerry Coffin

17

A std::stringคือการสร้างอินสแตนซ์ของstd::basic_stringเทมเพลตด้วยประเภทchar. คุณต้องใช้ทั้งสองอย่างเพื่อที่คุณจะสามารถสร้างสตริงของสิ่งต่างๆได้charเช่นstd::basic_string<wchar_t>สำหรับสตริงที่มีอักขระแบบกว้าง หรือถ้าคุณต้องการสตริงที่มีองค์ประกอบ 32 บิต, std::basic_string<unsigned int>.


2
ฉันคิดว่านี่น่าจะเป็นคำตอบที่ได้รับการโหวตสูงสุด มีกรณีการใช้งานเมื่อคุณจะไม่สร้างอินสแตนซ์std::basic_stringโดยไม่มีcharประเภท
hlin117
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.