An iterator pattern is used to traverse a container and access its elements. The power of this pattern is that it decouples algorithms from the container implementation. We can then write an algorithm that is coded to the iterator interface and not to the actual implementation of the container.
Let's say we have two completely different data structures, an array and a linked list. If we need to implement the same algorithm operating on both structures, we have to write two versions of the code. You would access an array with direct addressing and the other would walk the linked list.
On the other hand, if both the array and linked list implement the same interface that allows the algorithm to walk over the data and access all elements, we can write only one version of the algorithm. Instead of working with data structures directly, the algorithm would work with that interface.