String_view là gì?


162

string_viewlà một tính năng được đề xuất trong C ++ Thư viện cơ bản TS ( N3921 ) được thêm vào C ++ 17

Theo như tôi hiểu thì đây là một loại đại diện cho một loại "khái niệm" chuỗi nào đó là dạng xem của bất kỳ loại container nào có thể lưu trữ thứ gì đó có thể xem được dưới dạng chuỗi.

  • Thê nay đung không ?
  • Các const std::string&loại tham số chính tắc nên trở thành string_view?
  • Có một điểm quan trọng khác sắp string_viewđược xem xét?

4
Cuối cùng, ai đó nhận ra rằng các chuỗi cần một ngữ nghĩa khác nhau, mặc dù việc giới thiệu chuỗi_view chỉ là một bước nhỏ.
John Z. Li

Câu trả lời:


183

Mục đích của bất kỳ và tất cả các loại đề xuất "tham chiếu chuỗi" và "tham chiếu mảng" là để tránh sao chép dữ liệu đã được sở hữu ở một nơi khác và trong đó chỉ có một chế độ xem không đột biến. Câu string_viewhỏi trong là một đề xuất như vậy; có những cái trước đó được gọi string_refarray_ref, quá.

Ý tưởng là luôn lưu trữ một cặp phần tử con trỏ đến đầu tiên và kích thước của một số mảng hoặc chuỗi dữ liệu hiện có .

Một lớp xử lý khung nhìn như vậy có thể được chuyển qua giá rẻ và sẽ cung cấp các hoạt động nền tảng giá rẻ (có thể được thực hiện dưới dạng tăng con trỏ đơn giản và điều chỉnh kích thước).

Nhiều cách sử dụng chuỗi không yêu cầu sở hữu chuỗi thực sự và chuỗi được đề cập thường sẽ được sở hữu bởi người khác. Vì vậy, có một tiềm năng thực sự để tăng hiệu quả bằng cách tránh các bản sao không cần thiết (nghĩ về tất cả các phân bổ và ngoại lệ bạn có thể lưu).

Các chuỗi C ban đầu đang gặp phải vấn đề là bộ kết thúc null là một phần của API chuỗi và vì vậy bạn không thể dễ dàng tạo các chuỗi con mà không làm thay đổi chuỗi bên dưới (a la strtok). Trong C ++, điều này dễ dàng được giải quyết bằng cách lưu trữ độ dài riêng biệt và gói con trỏ và kích thước vào một lớp.

Một trở ngại và sự khác biệt lớn từ triết lý thư viện tiêu chuẩn C ++ mà tôi có thể nghĩ đến là các lớp "xem tham chiếu" như vậy có ngữ nghĩa sở hữu hoàn toàn khác với phần còn lại của thư viện chuẩn. Về cơ bản, mọi thứ khác trong thư viện chuẩn đều an toàn và chính xác vô điều kiện (nếu nó biên dịch, nó chính xác). Với các lớp tham chiếu như thế này, điều đó không còn đúng nữa. Tính chính xác của chương trình của bạn phụ thuộc vào mã môi trường sử dụng các lớp này. Vì vậy, khó kiểm tra và dạy hơn.


19
Con tàu đi theo triết lý đó reference_wrapper, phải không?
Steve Jessop 27/12/13

5
@KerrekSB Tôi sợ tôi không theo dõi. Bạn có thể mở rộng trên phần "các lớp xem tham chiếu như vậy có ngữ nghĩa sở hữu hoàn toàn khác với phần còn lại của thư viện chuẩn" không? Nó không rõ ràng với tôi: Nó khác với các tham chiếu / con trỏ lơ lửng như thế nào? Hoặc các trình vòng lặp không hợp lệ do chèn (ví dụ: std :: vector)? Chúng tôi đã có những vấn đề này rồi, rất tự nhiên với tôi rằng một quan điểm không sở hữu sẽ có những vấn đề tương tự như các con trỏ / tham chiếu / iterator không sở hữu.
Ali

5
@Ali: Khi bạn đang sử dụng bất kỳ bộ chứa thư viện tiêu chuẩn nào khác, bạn có thể khẳng định tính chính xác của mã chỉ bằng cách xem mã sử dụng bộ chứa. Không phải như vậy cho string_view. (Tôi không nói rằng bạn không bao giờ có thể viết mã bị hỏng. Chỉ là sự hỏng là cục bộ .)
Kerrek SB

6
Tôi ngạc nhiên họ không đi với std::rangetừ boost::iterator_range- IMO đó là tốt hơn so với ý tưởng string_view
Charles Salvia

19
@nwp: Nhiều người và ngôn ngữ đã than thở về những mặc định khủng khiếp của C ++ và nghĩ rằng "const" và "không chia sẻ" nên được mặc định, với "ngoại lệ" và "chia sẻ" các ngoại lệ rõ ràng, hiếm gặp.
Kerrek SB
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.