'size_t' so với 'container :: size_type'


108

Có sự khác biệt giữa size_tcontainer::size_type?

Những gì tôi hiểu là size_tchung chung hơn và có thể được sử dụng cho bất kỳ size_types.

Nhưng có được container::size_typetối ưu hóa cho các loại container cụ thể không?

Câu trả lời:


108

Các container tiêu chuẩn xác định size_typenhư một typedef để Allocator::size_type(cấp phát là một tham số mẫu), mà cho std::allocator<T>::size_typethường định nghĩa là size_t(hoặc một loại tương thích). Vì vậy, đối với trường hợp tiêu chuẩn, chúng giống nhau.

Tuy nhiên, nếu bạn sử dụng bộ phân bổ tùy chỉnh, một loại cơ bản khác có thể được sử dụng. Vì vậy, container::size_typeđược ưu tiên cho tính tổng quát tối đa.


2
Bạn có thể làm rõ câu trả lời này? Tôi đã xem lại các tiêu chuẩn dự thảo từ trước đến nay N1804và tôi không thấy bất kỳ mối quan hệ nào giữa Allocator::size_typesize_type. Nhìn lướt qua libstdc ++ cũng không cho thấy bất kỳ điều gì tương tự như điều này.
Shafik Yaghmour

1
@ShafikYaghmour, Vì vậy, câu trả lời này hơi lỗi thời, nhưng để tối đa hóa tính di động, tôi nghĩ lời khuyên vẫn là đúng đắn: C ++ 03 đã chỉ định "Bảng 32: size_type: một kiểu có thể đại diện cho kích thước của đối tượng lớn nhất trong mô hình phân bổ." Vào thời điểm đó, size_tđặt cược thực tế là thực hiện những ràng buộc đó. Tuy nhiên, trong C ++ 11, về cơ bản nó được định nghĩa là: std::make_unsigned<X::difference_type>::typetheo mặc định. Mà trong thực tế, có thể sẽ giống nhau hoặc tương thích với size_t.
Evan Teran

2
CARE câu trả lời là không chính xác .... xem stackoverflow.com/questions/4849678/… TL: DR: phân bổ size_type cần phải là size_t và trong C ++ 17 size_type sẽ không được dùng nữa.
user3063349

1
@ user3063349 Tôi không thấy gì trong trang đó, cũng như trong Tiêu chuẩn C ++ 2017 (23.10.8), gợi ý về việc size_typekhông dùng nữa. Đưa cái gì?
Marc.2377

42
  • size_tđược định nghĩa là kiểu được sử dụng cho kích thước của một đối tượng và phụ thuộc vào nền tảng .
  • container::size_typelà kiểu được sử dụng cho số phần tử trong vùng chứa và phụ thuộc vào vùng chứa .

Tất cả các vùng stdchứa đều sử dụng size_tnhư là size_type, nhưng mỗi nhà cung cấp thư viện độc lập chọn một kiểu mà họ thấy thích hợp cho vùng chứa của mình.

Nếu bạn nhìn vào , bạn sẽ thấy rằng các vùng size_typechứa Qt phụ thuộc vào phiên bản. Trong Qt3 nó là unsigned intvà trong Qt4 nó đã được đổi thành int.


1
Tôi thấy hơi kỳ lạ khi có kích thước của thứ gì đó được biểu thị dưới dạng int. Chúng ta có thể có kích thước âm cho một vùng chứa không?
Mihai Todor

10
@MihaiTodor: không có gì lạ khi mọi người sử dụng kiểu có chữ ký cho mọi thứ, tôi đoán Qt đang làm theo. Lý do là các phép toán hỗn hợp (cụ thể là các phép so sánh) là một khu vực thảm họa đến nỗi nhiều người muốn tránh sử dụng các kiểu không có dấu cho các số, hơn là phải xử lý và / hoặc tránh các hoạt động hỗn hợp. Chỉ vì loại unsigned không thể diễn tả số âm, không có nghĩa là bạn sử dụng chúng cho số mà không thể tiêu cực :-) Tôi thú nhận tôi ngạc nhiên đó là inthơn ssize_t, intlà loại nhỏ.
Steve Jessop

2
"Tất cả các container std sử dụng size_t làm size_type" rất sai và gây hiểu lầm. Có, họ THẬT SỰ làm (ít nhất là tất cả các trình biên dịch của tôi đã làm theo cách đó) nhưng tham chiếu ngôn ngữ C ++ không có trạng thái, rằng nó cần phải giống nhau cho tất cả các vùng chứa stl !! để chăm sóc
user3063349


8

Đối với std::[w]string, std::[w]string::size_typelà bằng với std::allocator<T>::size_type, mà là bằng std::size_t. Đối với các vùng chứa khác, đó là một số kiểu số nguyên không dấu được xác định triển khai.

Đôi khi, rất hữu ích khi có loại chính xác, vì vậy, ví dụ, người ta biết nơi loại bao quanh (thích, đến UINT_MAX) để người ta có thể sử dụng nó. Hoặc đối với các mẫu, nơi bạn thực sự cần chuyển hai loại giống hệt nhau đến các mẫu hàm / lớp.

Thường thì tôi thấy tôi sử dụng size_tcho ngắn gọn hoặc trình vòng lặp. Trong mã chung, vì bạn thường không biết mẫu của bạn được sử dụng với thể hiện vùng chứa nào và kích thước của các vùng chứa đó, bạn sẽ phải sử dụng Container::size_typetypedef nếu bạn cần lưu trữ kích thước vùng chứa.

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.