Что означает size_type в конструкторе вектора?

Спецификация для конструктора вектора, который я использую:

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?

Пожалуйста, игнорируйте аппаратные соображения, например, может ли компьютер вообще выделять достаточно памяти. Я буду беспокоиться об этом позже, а сейчас я просто хочу сосредоточиться на понимании этой концепции.

1

Решение

Это typedef определяется внутри std::vector; на самом деле это синоним std::size_t, который, в свою очередь, является typedef для определенного целочисленного типа без знака, способного содержать размер самого большого объекта, который можно создать на текущей машине. На практике вы можете думать об этом как о некотором целом числе без знака, которое всегда используется на протяжении всего std::vector интерфейс при обращении к индексу или количеству элементов.

На «обычных» машинах (где у вас есть 32-битные целые числа) и если вы не выходите за пределы «обычных» ints в вашем коде для количества элементов, которые вы можете использовать int для индексов без проблем (и вы на самом деле защищены от тонких ошибок, которые возникают в результате арифметики / сравнения на целых числах без знака).

2

Другие решения

std::vector<T>::size_type целочисленный тип без знака, который может представлять размер самого большого объекта в модели размещения. Это часто будет чем-то вроде std::size_t,

Если вы не думаете, что столкнетесь с максимальными интегральными значениями, вам не нужно беспокоиться об этом; просто передайте целочисленный тип, и компилятор скажет вам, если вы сделали что-то возмутительное.

0

std::size_t это тип данных, который достаточно большой, чтобы вместить размер любой структуры, к которой может обращаться ваша машина. Так что на 32-битных машинах это обычно 32-битное целое число без знака.

T::size_type определяется множеством контейнеров и обычно переопределяет просто std::size_t (но строго не обязательно). Причина для того, чтобы определить это, что вы можете просто написать T::size_type x = T::your_operation(); не думая, какой контейнер вы используете. Позже вы можете переключить контейнер, и T :: size_type все еще является допустимым C ++ и не требует доработки.

0
По вопросам рекламы [email protected]