В чем разница между (*it).first и it->first?

#c 11 #iterator

#c 11 #итератор

Вопрос:

В чем разница между (*it).first и it->first ?

Могут ли они использоваться взаимозаменяемо, например, в приведенном ниже коде? Кроме того, действительно помогло бы, если у кого-то есть хороший ресурс, где я могу узнать об итераторах. Конкретно об этой строке vector<pair<int, int>>:: iterator it; Кто-нибудь может это объяснить?

 vector<pair<int, int>> adj[10005]; //For storing vertices, weights of a directed graph as an adjacency list

for(int i = 1; i <= V; i  )//GOING THROUGH EACH VERTEX
{
  vector<pair<int, int>>:: iterator it;
  for(it = adj[i].begin(); it != adj[i].end(); it  )
  {
   cout<<it->first<<" ";
   cout<<it->second<<"n";
  }
}
  

Комментарии:

1. Технически разница есть. Практически нет никакой разницы.

2. Что касается рекомендации ресурсов, это не по теме для этого сайта

3. Хорошо, вот отличный сайт, который я только что нашел cprogramming.com/tutorial/stl/iterators.html

Ответ №1:

Итераторы спроектированы так, что они используются как указатели. Для указателей p->expr это «сокращение» для (*p).expr , поэтому итераторы спроектированы так, что it->expr делают то же самое, (*it).expr что и . Если все, что вы хотите, это знать, как их использовать, тогда знайте, что it->expr и (*it).expr эквивалентны.

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

Стандарт просто определяет некоторые ограничения и требования к тому, как реализуются итераторы, но не определяет фактический тип. Таким образом, для итераторов произвольного доступа (например std::vector<int>::iterator ) итератор может быть псевдонимом для указателя. Некоторые реализации, особенно в режиме отладки, определяют фактический класс для итератора для дополнительных проверок безопасности. А для итераторов с неслучайным доступом единственным вариантом является определение класса итератора.

Если это класс, то:

  • (*it) вызовет Iterator::operator*() , который должен вернуть ссылку на указанный объект. И тогда .expr это просто оператор доступа к члену для этого указанного типа.

  • it->expr вызовет Iterator::operator->() , который должен вернуть указатель на указанный объект, а затем получить доступ к expr члену.

Операторы в C и C

перегрузка оператора