Чи є різниця між size_tі container::size_type?
Що я розумію, size_tце більш загальне і може бути використане для будь-яких size_types.
Але container::size_typeоптимізовано під конкретні види контейнерів?
Чи є різниця між size_tі container::size_type?
Що я розумію, size_tце більш загальне і може бути використане для будь-яких size_types.
Але 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_typetypedef, якщо вам потрібно зберегти розмір контейнерів.
N1804і не бачу жодних стосунків міжAllocator::size_typeтаsize_type. Швидкий погляд на libstdc ++ також не показує нічого подібного.