Спецификация для конструктора вектора, который я использую:
vector(size_type count, const T& value, const Allocator& alloc = Allocator());
Я пытаюсь инициализировать вектор, и я не очень знаком с size_type. У cplusplus и cppreference нет записи для size_type
, Быстрый Google говорит мне, что это какой-то тип данных для представления размеров, емкости и т. Д. Для таких вещей, как контейнеры (я думаю). Я до сих пор не уверен, правильно ли я понимаю или как его использовать.
Допустим, я хочу инициализировать int
вектор подсчета (10*n/3) + 1
где n
имеет тип int
, Могу ли я бросить считать как тип long
? Я даже делаю это правильно? Как я понимаю и использовать size_type
?
Пожалуйста, игнорируйте аппаратные соображения, например, может ли компьютер вообще выделять достаточно памяти. Я буду беспокоиться об этом позже, а сейчас я просто хочу сосредоточиться на понимании этой концепции.
Это typedef
определяется внутри std::vector
; на самом деле это синоним std::size_t
, который, в свою очередь, является typedef для определенного целочисленного типа без знака, способного содержать размер самого большого объекта, который можно создать на текущей машине. На практике вы можете думать об этом как о некотором целом числе без знака, которое всегда используется на протяжении всего std::vector
интерфейс при обращении к индексу или количеству элементов.
На «обычных» машинах (где у вас есть 32-битные целые числа) и если вы не выходите за пределы «обычных» int
s в вашем коде для количества элементов, которые вы можете использовать int
для индексов без проблем (и вы на самом деле защищены от тонких ошибок, которые возникают в результате арифметики / сравнения на целых числах без знака).
std::vector<T>::size_type
целочисленный тип без знака, который может представлять размер самого большого объекта в модели размещения. Это часто будет чем-то вроде std::size_t
,
Если вы не думаете, что столкнетесь с максимальными интегральными значениями, вам не нужно беспокоиться об этом; просто передайте целочисленный тип, и компилятор скажет вам, если вы сделали что-то возмутительное.
std::size_t
это тип данных, который достаточно большой, чтобы вместить размер любой структуры, к которой может обращаться ваша машина. Так что на 32-битных машинах это обычно 32-битное целое число без знака.
T::size_type
определяется множеством контейнеров и обычно переопределяет просто std::size_t
(но строго не обязательно). Причина для того, чтобы определить это, что вы можете просто написать T::size_type x = T::your_operation();
не думая, какой контейнер вы используете. Позже вы можете переключить контейнер, и T :: size_type все еще является допустимым C ++ и не требует доработки.