'size_t' vs 'контейнер :: size_type'


108

Чи є різниця між size_tі container::size_type?

Що я розумію, size_tце більш загальне і може бути використане для будь-яких size_types.

Але container::size_typeоптимізовано під конкретні види контейнерів?

Відповіді:


108

Стандартні контейнери визначають size_typeяк ЬурейеЕ до Allocator::size_type(Розподільник є параметром шаблону), який в протягом std::allocator<T>::size_typeяк правило , певних , щоб бути size_t(або сумісним типом). Так що для стандартного випадку вони однакові.

Однак якщо ви використовуєте спеціальний розподільник, може бути використаний інший базовий тип. Тому container::size_typeбажано для максимальної загальності.


2
Чи можете ви уточнити цю відповідь? Я ще раз оглянувся на проекти стандартів N1804і не бачу жодних стосунків між Allocator::size_typeта size_type. Швидкий погляд на libstdc ++ також не показує нічого подібного.
Шафік Ягмур

1
@ShafikYaghmour, Отже, ця відповідь трохи застаріла, але для максимальної переносимості я вважаю, що порада все ще звучить: C ++ 03 вказано "Таблиця 32: size_type: тип, який може представляти розмір найбільшого об'єкта в моделі розподілу". У той час, size_tставка була практичною реалізацією цих обмежень. Однак у C ++ 11 він тепер по суті визначається як: std::make_unsigned<X::difference_type>::typeза замовчуванням. Що на практиці, ймовірно, буде таким же чи сумісним size_t.
Еван Теран

2
ДОГЛЯДУЙТЕ відповідь невірна .... див. Stackoverflow.com/questions/4849678/… TL: DR: алокатори size_type повинні бути size_t, а в C ++ 17 розмір_тип буде застарілим як є.
користувач3063349

1
@ user3063349 Я нічого не бачу ні на цій сторінці, ні в Стандарті C ++ 2017 (23.10.8), що б натякнуло на депресію size_type. Що дає?
Марк.2377,

42
  • size_tвизначається як тип, що використовується для розміру об'єкта і залежить від платформи .
  • container::size_type- тип, який використовується для кількості елементів у контейнері і залежить від контейнера .

Усі stdконтейнери використовують size_tяк size_type, але кожен незалежний постачальник бібліотеки вибирає тип, який вважає відповідним для свого контейнера.

Якщо ви дивитесь , ви побачите, що size_typeконтейнери Qt залежать від версії. У Qt3 це було, unsigned intа в Qt4 було змінено на int.


1
Я вважаю трохи дивним розмір чогось вираженого як int. Чи може ми колись мати негативний розмір для контейнера?
Михай Тодор

10
@MihaiTodor: людям незвично використовувати підписані типи для всього, я думаю, Qt слід за цим. Причина полягає в тому, що змішані операції (зокрема порівняння) - це така зона катастрофи, що багато людей швидше уникають використання непідписаних типів для числення, ніж доводиться стикатися з та / або уникати змішаних операційних можливостей. Просто тому , що беззнакових типів не може висловити негативні числа, не означає , що ви повинні використовувати їх для чисел , які не можуть бути негативними :-) Я зізнаюся , я здивований , що це , intа не ssize_t, intце свого роду невеликий.
Стів Джессоп

2
"Усі контейнери std використовують size_t як size_type" дуже неправдивим і оманливим. Так, вони НАЗАГАЛЬНО (принаймні, всі мої компілятори так робили), але посилання на мову C ++ не вказує, що воно повинно бути подібним для всіх контейнерів stl !! так турбота
user3063349


8

Для std::[w]string, std::[w]string::size_typeтак само std::allocator<T>::size_type, що дорівнює std::size_t. Для інших контейнерів це деякий тип, визначений цілим числом без підпису.

Іноді корисно мати точний тип, тому, наприклад, ви знаєте, куди накручується тип (як, щоб UINT_MAX), щоб можна було скористатися цим. Або для шаблонів, де вам дійсно потрібно передати два однакових типи для шаблонів функцій / класів.

Часто я знаходжу, що я використовую size_tдля стислості або ітераторів у будь-якому випадку. У загальному коді, оскільки ви, як правило, не знаєте, для якого екземпляра контейнера використовується ваш шаблон і якого розміру вони мають, вам доведеться використовувати Container::size_typetypedef, якщо вам потрібно зберегти розмір контейнерів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.