Я вижу, что многие люди разрешают подписываться int
, но мне кажется, что это из-за невежества, потому что это вызывает несоответствия подписей/без знака для типов контейнеров, которые используют unsigned size_type
s.Итератор арифметический тип
Поскольку нет способа получить тип контейнера для предоставленных итераторов, я не вижу способа получить size_type
предполагаемого контейнера для выполнения точной арифметики.
Какой тип мы должны использовать при выполнении арифметических операций на итераторах? Или еще лучше, как можно получить базовый size_type
контейнера, поскольку итераторы не знают своего родительского контейнера?
Edit2:
Что я имею в виду базового типа размера будет, например:
std::vector<some_type>::size_type
для некоторого итератора, чей контейнер тип std::vector<some_type>
Edit1:
Я думаю, что C++ 17 предоставляет решение этой проблемы через некоторые функции доступа к контейнеру:
Эти функции, не являющиеся членами, предоставляют общий интерфейс для контейнеров, простых массивов и std :: initializer_list.
- (функция) размер (C++ 17) возвращает размер контейнера или массива
- (функция) пустые (C++ 17) проверяет, является ли пустой контейнер
- (функция) данные (C++ 17) получает указатель на базовый массив
Более конкретно размер дает объявленный тип поля размера для родительского контейнера.
В качестве примера «RandomAccessIterator» определяет оператор '+ =' и '+', который принимает целое число со знаком и возвращает итератор. Почему это приводит к предупреждениям о несоответствии подписанных/неподписанных символов или необходимости знать 'size_type'? –
Вы в основном спрашиваете, можете ли вы получить 'size_type' исключительно из итератора? Ответ большой НЕТ, подумайте о реализации, которая реализует итераторы как указатели, у них нет информации о контейнере вообще. Итераторы «знают», как продвигаться, поэтому зачем вам нужен «размер_тип»? – vsoftco
Можете ли вы показать пример, в котором вам дали итераторы, и вам нужен размер 'size_type 'контейнера? Что делать, если итераторы являются указателями на простой массив? – Praetorian