2009-05-27 29 views
83

Có sự khác biệt nào giữa size_tcontainer::size_type không?'size_t' vs 'container :: size_type'

Điều tôi hiểu là size_t là tổng quát hơn và có thể được sử dụng cho bất kỳ size_type s nào.

Nhưng là container::size_type được tối ưu hóa cho các loại container cụ thể?

Trả lời

88

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_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 trình 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 là thích hợp hơn cho tổng quát tối đa.

+2

Bạn có thể làm rõ câu trả lời này không? Tôi đã nhìn lại các tiêu chuẩn dự thảo như xa trở lại như 'N1804' và tôi không thấy bất kỳ mối quan hệ nào giữa' Allocator :: size_type' và 'size_type'. Một cái nhìn nhanh chóng tại libstdC++ không hiển thị bất cứ điều gì tương tự như thế này. –

+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à âm thanh: C++ 03 được chỉ định "Bảng 32: size_type: loại 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 lúc đó, 'size_t' là việc thực hiện đặt cược thực tế của những ràng buộc đó. Tuy nhiên, trong C++ 11, nó được định nghĩa cơ bản là: 'std :: make_unsigned :: type' theo mặc định. Trong thực tế, có thể sẽ giống hoặc tương thích với 'size_t'. –

+1

CHĂM SÓC câu trả lời là không chính xác .... xem http: // stackoverflow.com/questions/4849678/c-for-loop-size-type-vs-size-t TL: DR: allocators size_type cần phải là size_t và trong C++ 17 size_type sẽ không còn được dùng nữa. – user3063349

8

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

Thỉnh thoảng hữu ích khi có loại chính xác, vì vậy, ví dụ: người ta biết loại kết thúc tốt đẹp xung quanh (như, để UINT_MAX) để người ta có thể tận dụng điều đó. Hoặc đối với các mẫu, nơi bạn thực sự cần phải chuyển hai loại giống hệt nhau cho các mẫu chức năng/lớp.

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

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

Tất cả std container sử dụng size_t làm size_type, nhưng mỗi nhà cung cấp thư viện độc lập chọn loại phù hợp cho vùng chứa của nó.

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

+1

Tôi thấy nó hơi lạ khi có kích thước của một cái gì đó thể hiện như một int. Chúng ta có thể có một kích thước âm cho một container? –

+8

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

+0

@Steve Có, bạn có một điểm. Cảm ơn. –