указатели поддерживают []
, что определяется как p[i]
, эквивалентный *(p + i)
. RandomAccessIterator s - это объекты, которые ведут себя как указатели, поэтому они также поддерживают это с тем же значением.
Несколько контейнеров также поддерживают []
.Из них есть два вида.
Первый тип - это SequenceContainer , которые являются итераторами RandomAccessIterator ,а параметр SequenceContainer::operator[]
равен std::size_t
, то есть что-то, что идентифицирует элемент по его положению в последовательности.vec[i]
- это то же самое, что vec.begin()[i]
- это то же самое, что и *(vec.begin() + i)
.
Если вы можете легко найти элемент по определенному индексу, ваши итераторы могут быть легко увеличены или уменьшены с помощью смещения, превышающего 1.
Второй тип - это AssociativeContainer s или UnorderedAssociativeContainers s, которые имеют mapped_type
.Параметр AssociativeContainer::operator[]
равен AssociativeContainer::key_type
, то есть что-то, что идентифицирует элемент по его значению.
Простой поиск элемента с определенным значением не помогает перемещаться по последовательности.Оказывается, что известные в настоящее время структуры данных, которые обеспечивают легкий доступ по значению, не так хороши, чтобы знать, какой элемент находится на n
дальше.