Чи є різниця між size_t
і container::size_type
?
Що я розумію, size_t
це більш загальне і може бути використане для будь-яких size_type
s.
Але container::size_type
оптимізовано під конкретні види контейнерів?
Чи є різниця між size_t
і container::size_type
?
Що я розумію, size_t
це більш загальне і може бути використане для будь-яких size_type
s.
Але container::size_type
оптимізовано під конкретні види контейнерів?
Відповіді:
Стандартні контейнери визначають size_type
як ЬурейеЕ до Allocator::size_type
(Розподільник є параметром шаблону), який в протягом std::allocator<T>::size_type
як правило , певних , щоб бути size_t
(або сумісним типом). Так що для стандартного випадку вони однакові.
Однак якщо ви використовуєте спеціальний розподільник, може бути використаний інший базовий тип. Тому container::size_type
бажано для максимальної загальності.
size_t
ставка була практичною реалізацією цих обмежень. Однак у C ++ 11 він тепер по суті визначається як: std::make_unsigned<X::difference_type>::type
за замовчуванням. Що на практиці, ймовірно, буде таким же чи сумісним size_t
.
size_type
. Що дає?
size_t
визначається як тип, що використовується для розміру об'єкта і залежить від платформи .container::size_type
- тип, який використовується для кількості елементів у контейнері і залежить від контейнера .Усі std
контейнери використовують size_t
як size_type
, але кожен незалежний постачальник бібліотеки вибирає тип, який вважає відповідним для свого контейнера.
Якщо ви дивитесь qt, ви побачите, що size_type
контейнери Qt залежать від версії. У Qt3 це було, unsigned int
а в Qt4 було змінено на int
.
int
а не ssize_t
, int
це свого роду невеликий.
Для std::[w]string
, std::[w]string::size_type
так само std::allocator<T>::size_type
, що дорівнює std::size_t
. Для інших контейнерів це деякий тип, визначений цілим числом без підпису.
Іноді корисно мати точний тип, тому, наприклад, ви знаєте, куди накручується тип (як, щоб UINT_MAX
), щоб можна було скористатися цим. Або для шаблонів, де вам дійсно потрібно передати два однакових типи для шаблонів функцій / класів.
Часто я знаходжу, що я використовую size_t
для стислості або ітераторів у будь-якому випадку. У загальному коді, оскільки ви, як правило, не знаєте, для якого екземпляра контейнера використовується ваш шаблон і якого розміру вони мають, вам доведеться використовувати Container::size_type
typedef, якщо вам потрібно зберегти розмір контейнерів.
N1804
і не бачу жодних стосунків міжAllocator::size_type
таsize_type
. Швидкий погляд на libstdc ++ також не показує нічого подібного.