Разыменование типа значения итератора итератора

0

Если я хочу перебирать 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?

  • 1
    Это итератор по парам. Рассматриваемый класс итератора перегружает операторы -> и *, чтобы дать ему семантику, аналогичную «указателю на пару», но это не то, чем он является на самом деле.
  • 0
    Вы также можете использовать ключевое слово auto en.cppreference.com/w/cpp/language/auto
Показать ещё 2 комментария
Теги:
stl

2 ответа

7
Лучший ответ

Итераторы - итераторы. Они не являются ни указателями, ни парами. Они итераторы.

"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.

  • 0
    Кто-то собирается указать в комментариях, что итераторы вектора часто реализуются как указатели. Они все еще "просто итераторы", хотя!
  • 0
    В некоторых ранних реализациях векторные итераторы часто были просто typedef для указателя, но я не знаю ни одной текущей реализации, которая делает это. (Конечно, в настоящее время у меня нет доступа ко многим различным реализациям.)
Показать ещё 5 комментариев
0

Ответ на ваш вопрос зависит от того, как выполняется итератор. Пока тип поддерживает операции, необходимые для итератора, реализация не является чем-то, о чем вы должны беспокоиться. В случае итераторов std::map очень хорошие шансы, что они на самом деле являются структурами, а не просто указателями. Причина в том, что обычно карты реализуются как сбалансированные деревья, поэтому итераторам необходимо знать, как перемещаться по дереву в порядке. Для этого требуется немного бухгалтерского учета (возможно, родительские узлы)?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню