Ответ 1
Что касается возможности выполнить задачу под рукой, все они работают одинаково хорошо. В конце концов, все они предоставляют объект, который удовлетворяет требованиям итератора, и вы используете их для указания того же элемента vector
. Однако, я бы выбрал опцию vector<int>::iterator
, потому что тип более выразителен в отношении того, как мы намерены его использовать.
Необработанный тип указателя int*
очень мало говорит о том, что такое p
, за исключением того, что он хранит адрес int
. Если вы думаете о p
изолированно, его тип не говорит вам о том, как вы можете его использовать. Параметр vector<int>::pointer
имеет ту же проблему - он просто выражает тип объектов, на которые он указывает, как тип элемента вектора. Нет причин, по которым на самом деле нужно указывать на vector
.
С другой стороны, vector<int>::iterator
сообщает вам все, что вам нужно знать. В нем явно указано, что объект является итератором и что итератор используется для указания элементов в vector<int>
.
Это также имеет преимущество, заключающееся в том, что вам легче ремонтироваться, если вам когда-либо случалось менять тип контейнера. Если вы, например, изменили на std::list
, тип указателя просто больше не работал бы, потому что элементы не сохранялись как непрерывный массив. Тип контейнера iterator
всегда предоставляет вам тип, который вы можете использовать для итерации по его элементам.
Когда у нас есть Понятия, я ожидаю, что лучшая практика будет чем-то вроде:
ForwardIteratorOf<int> it = std::begin(v);
где ForwardIteratorOf<int>
(который, как я полагаю, существует), изменяется на любое понятие, наилучшим образом описывающее ваши намерения для it
. Если тип элементов не имеет значения, то просто ForwardIterator
(или BidirectionalIterator
, RandomAccessIterator
или что-то еще).