Có sự khác biệt giữa size_t
và container::size_type
?
Những gì tôi hiểu là size_t
chung chung hơn và có thể được sử dụng cho bất kỳ size_type
s.
Nhưng có được container::size_type
tối ưu hóa cho các loại container cụ thể không?
Có sự khác biệt giữa size_t
và container::size_type
?
Những gì tôi hiểu là size_t
chung chung hơn và có thể được sử dụng cho bất kỳ size_type
s.
Nhưng có được container::size_type
tối ưu hóa cho các loại container cụ thể không?
Câu trả lời:
Các container tiêu chuẩn xác định size_type
như một typedef để Allocator::size_type
(cấp phát là một tham số mẫu), mà cho std::allocator<T>::size_type
là thườ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.
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>::type
theo mặc định. Mà trong thực tế, có thể sẽ giống nhau hoặc tương thích với size_t
.
size_type
không dùng nữa. Đưa cái gì?
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_type
là 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 std
chứa đều sử dụng size_t
như 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 qt, bạn sẽ thấy rằng các vùng size_type
chứa Qt phụ thuộc vào phiên bản. Trong Qt3 nó là unsigned int
và trong Qt4 nó đã được đổi thành int
.
int
hơn ssize_t
, int
là loại nhỏ.
Đối với std::[w]string
, std::[w]string::size_type
là 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_t
cho 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_type
typedef nếu bạn cần lưu trữ kích thước vùng chứa.
N1804
và tôi không thấy bất kỳ mối quan hệ nào giữaAllocator::size_type
vàsize_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.