There are so many alternative ways of addressing elements of a vector.
I could use a pointer like so:
vector<int> v = {10, 11, 12};
int *p = &v[0];
cout << *p; //Outputs "10"
I could use a pointer this way too:
vector<int> v = {10, 11, 12};
vector<int>::pointer p = v.data();
cout << *p; //Outputs "10"
I could also use the iterator type:
vector<int> v = {10, 11, 12};
vector<int>::iterator i = v.begin();
cout << *i; //Outputs "10"
Are there any significant differences that I'm missing here?
An iterator is an object (like a pointer) that points to an element inside the container. We can use iterators to move through the contents of the container.
A pointer hold an address in memory. An iterator may hold a pointer, but it may be something much more complex. For example, an iterator can iterate over data that's on file system, spread across many machines, or generated locally in a programmatic fashion.
Iterators is a generic concept. They work on all sorts of containers and have similar interface. Accessing the array element directly like arr_int[i] is definitely faster because it directly translates to pointer arithmetic.
Which of the following is a true statement about the difference between pointers and iterators? While pointers are variable that hold memory address, iterators are generic functions used to traverse containers. These function allows the programmer to implement read and write code as the container is traversed.
As far as being able to perform the task at hand, they all work equally well. After all, they all provide an object which meets the requirements of an iterator and you are using them to point at the same element of the vector
. However, I would pick the vector<int>::iterator
option because the type is more expressive about how we intend to use it.
The raw pointer type, int*
, tells you very little about what p
is, except that it stores the address of an int
. If you think about p
in isolation, its type doesn't tell you very much about how you can use it. The vector<int>::pointer
option has the same issue - it just expresses the type of the objects it points at as being the element type of a vector. There's no reason it actually needs to point into a vector
.
On the other hand vector<int>::iterator
tells you everything you need to know. It explicitly states that the object is an iterator and that iterator is used to point at elements in a vector<int>
.
This also has the benefit of being more easily maintainable if you ever happen to change the container type. If you changed to a std::list
, for example, the pointer type just wouldn't work any more because the elements are not stored as a contiguous array. The iterator
type of a container always provides you with a type you can use to iterate over its elements.
When we have Concepts, I'd expect the best practise to be something like:
ForwardIteratorOf<int> it = std::begin(v);
where ForwardIteratorOf<int>
(which I am imagining exists) is changed to whatever concept best describes your intentions for it
. If the type of the elements doesn't matter, then just ForwardIterator
(or BidirectionalIterator
, RandomAccessIterator
, or whatever).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With