#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
члену.