2010-03-13 20 views
5

Chúng đều là các mảng có thể thay đổi kích cỡ và std :: basic_string không có bất kỳ hàm nào liên quan đến ký tự cụ thể như upper(). Có gì đặc biệt về chuỗi để làm cho nó tốt hơn cho dữ liệu ký tự?Tại sao các loại chuỗi và vector khác biệt?

Trả lời

10

Hầu hết lý do phải làm với bản địa hóa và quốc tế hóa (L10I18), hiệu suất và lý do lịch sử.

Đối với các vấn đề L10I18, char_traits được thêm vào và bạn cũng sẽ lưu ý rằng các luồng cũng có các luồng này. Mục đích là để làm cho "nhân vật thông minh hơn" theo một cách, nhưng kết quả là vô dụng. Về điều duy nhất char_traits là tốt cho là để chuyên một số std :: string/wstring so sánh, bản sao, vv như trình biên dịch nội tại.

Sự cố chủ yếu là do luồng UNIX, mà thấy ký tự là "nguyên tử" chính trong GUI, web vv được quốc tế hóa chuỗi là nguyên tử chính "." Nói cách khác, trong đất C/C++, chúng ta có "các mảng ký tự thông minh" cho các chuỗi, trong khi mọi ngôn ngữ khác sử dụng "các mảng thông minh của các ký tự câm". Unicode có cách tiếp cận thứ hai.

Sự khác biệt lớn giữa basic_string và vector - basic_string chỉ có thể chứa các loại POD. Điều này có thể tạo ra sự khác biệt trong một số trường hợp vào thời điểm nào đó trình biên dịch có thời gian tối ưu hóa basic_string dễ dàng hơn so với vectơ.

basic_string đôi khi có nhiều tối ưu hóa khác, chẳng hạn như Sao chép khi viết và Tối ưu hóa chuỗi nhỏ. Những thay đổi từ một trong những thực hiện kế tiếp. Tuy nhiên có lẽ lý do nhất có hai thứ gần như giống nhau là lịch sử: các chuỗi trước STL khá một chút, và hầu hết công việc dường như tập trung vào việc làm cho chúng tương thích với thư viện IOStream. Một C++ Urban Myth là STL là một "thư viện chứa" được thêm vào C++.Nó không phải là, và để có được nó được thông qua vào C + +, container đã được thêm vào. Một "Giao diện STL" cũng được bắt vít vào lớp chuỗi hiện có. std :: vector phần lớn được lấy từ một triển khai vector tồn tại trong AdaSTL.

1

Đó là quyết định thiết kế sớm trong quá trình tạo STL. Tôi nghĩ rằng rất nhiều người bây giờ thừa nhận rằng giao diện của std::string quá cồng kềnh và không phù hợp với phần còn lại của STL, nhưng đã quá muộn để thay đổi nó.

+0

Vâng, đó là loại kiến ​​thức phổ biến. Một trong những cuốn sách Sutter/Alexandrescu C++ thậm chí có một chương về nó (cùng với một bài tập thiết kế lại std :: string class). – riviera

3

Chuỗi có các chức năng liên quan đến chuỗi đặc biệt: c_str, substr, nối, trong số các chuỗi khác. Ngoài ra, đừng quên điểm quan trọng là strings sẽ tự động thêm '\0' vào cuối dữ liệu của chúng (và xử lý dữ liệu chính xác với kết nối, v.v.) để chúng không có hoạt động giống như vector<char> hoặc một cái gì đó tương tự.

Nhưng có, chúng cực kỳ giống nhau. Cả hai đều giữ một con trỏ đến một mảng phân bổ heap, nhưng chúng chắc chắn không giống nhau.

+0

Tôi không thực sự nhìn thấy chất nền hoặc nối như chuỗi ký tự cụ thể. Có những ngôn ngữ cung cấp những ngôn ngữ cho các mảng tùy ý. Bạn đang đúng về việc kết thúc null, mặc dù: c_str() là, không may, hàm phổ biến nhất tôi sử dụng trên std :: string. – dan04

+0

@ dan04: std :: chuỗi có rất nhiều chức năng và quá tải được thiết kế để làm cho nó hoạt động trong tay với các chuỗi kiểu C (mà xảy ra là những chuỗi ký tự trong C++). Nó sẽ là vô nghĩa đối với 'vector ' để hỗ trợ tất cả các hoạt động đó cho 'T *', vì 'char *' xảy ra là một con trỏ với một ý nghĩa rất cụ thể. – UncleBens

6

std :: string có rất nhiều nhà khai thác mà std :: vector không:

  • operator + (nối thêm chuỗi một chuỗi b + không thực sự có ý nghĩa cho vector)
  • hành <,>, ==,! = (string so sánh, một số không có ý nghĩa cho vector)
  • c_str() (trả về một "C phong cách" đại diện)
  • Và hơn (bao gồm chuỗi, tìm, vv nhưng một số trong số này được chèn vào nơi khác trong STL và có thể được sử dụng trên vectơ, loại)

Phải thừa nhận rằng có một chút khác std :: chuỗi có một vectơ không hoặc không thể, nhưng điều này rất quan trọng, chúng là phần lớn các trường hợp sử dụng cho một chuỗi.

Các vấn đề liên quan