Có sự khác biệt giữa size_tvà container::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ó sự khác biệt giữa size_tvà container::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:
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_typelà 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>::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.
size_typekhô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_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 qt, 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.
inthơn ssize_t, intlà loại nhỏ.
Đố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.
N1804và tôi không thấy bất kỳ mối quan hệ nào giữaAllocator::size_typevà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.