Если я хочу перебирать stl-карту, я обычно использую
for (it=my_map.begin();it!=my_map.end();it++)
{
}
Я знаю, что if (typeid(map<int,char>::iterator::value_type) == typeid(pair<const int,char>))
имеет значение TRUE, то есть тип значения iterator
std::map(key_type,value_type)
является std::pair(const key_type,value_type)
.
Но если я хочу сделать
std::pair<const key_type,value_type> b=it;
компилятор даст ошибку?
Это присвоение std::pair<const key_type,value_type> b=*it;
работает.
Мой вопрос: Каков тип iterator pointer to pair
или pair
?
Итераторы - итераторы. Они не являются ни указателями, ни парами. Они итераторы.
"Dereferencing" 1 итератор из std::map<K, V>
даст вам std::pair<const K, V>&
2 да, но сам итератор имеет свой собственный тип.
1) Операторы *
и ->
перегружены для выполнения этой косвенности, так как итератор на самом деле не является указателем в смысле C++.
2) Или const std::pair<const K, V>&
, если вы начали с std::map<K, V>::const_iterator
.
Ответ на ваш вопрос зависит от того, как выполняется итератор. Пока тип поддерживает операции, необходимые для итератора, реализация не является чем-то, о чем вы должны беспокоиться. В случае итераторов std::map
очень хорошие шансы, что они на самом деле являются структурами, а не просто указателями. Причина в том, что обычно карты реализуются как сбалансированные деревья, поэтому итераторам необходимо знать, как перемещаться по дереву в порядке. Для этого требуется немного бухгалтерского учета (возможно, родительские узлы)?