C ++ STL, мне интересно, что отличается между двунаправленным итератором и оператором [] в карте - PullRequest
0 голосов
/ 01 марта 2019

Я узнал, что между итератором с произвольным доступом и двунаправленным итератором отличается.итератор произвольного доступа может использовать оператор +, -, += , -=, [], а двунаправленный итератор - нет.Карта использует двунаправленный итератор.Но на карте все еще используется оператор [].

, например:

map<int,int> a;
a[5]++;

, он работает хорошо.

Я не понимаю, для чего это нужно.

Случайно, можете ли вы сказать мне, как?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Итератор произвольного доступа может использовать оператор +, -, + =, - =, [], но двунаправленный итератор не может.

Это упрощение, и вы поняли, почему.

Двунаправленный итератор не может выполнить операции произвольного доступа .Для некоторых контейнеров [] является операцией произвольного доступа.Требуется некоторое «расстояние» в контейнер.

Для ассоциативного контейнера, такого как карта, это не так: это операция, специально разработанная для этих контейнеров.Он принимает ключ и дает вам значение .Это другая операция.

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

0 голосов
/ 01 марта 2019

указатели поддерживают [], что определяется как 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 дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...