I’m returning to c++ after being away for a bit and trying to dust off the old melon.
In Java Iterator is an interface to a container having methods: hasNext(), next() and remove(). The presence of hasNext() means it has the concept of a limit for the container being traversed.
//with an Iterator Iterator<String> iter = trees.iterator(); while (iter.hasNext()) { System.out.println(iter.next()); }
In the C++ standard template library, iterators seem to represent a datatype or class the supports the operator++ and operator== but has no concept of a limit built in so comparison is required before advancing to the next item. The limit has to checked by the user comparing two iterators in the normal case the second iterator is the container end.
vector<int> vec; vector<int>::iterator iter; // Add some elements to vector v.push_back(1); v.push_back(4); v.push_back(8); for (iter= v.begin(); iter != v.end(); iter++) { cout << *i << ' '; //Should output 1 4 8 }
The interesting part here is that in C++ a pointer is an iterator to an array. The STL took what was existing and build convention around it.
It there any further subtlety to this that I am missing?
Yes, there is a large conceptual difference. C++ utilizes different ‘classes’ of iterators. Some are used for random access (unlike Java), some are used for forward access (like java). While even others are used for writing data (for use with, say,
transform).See the iterators concept in the C++ Documentation:
These are far more interesting and powerful compared to Java/C#’s puny iterators. Hopefully these conventions will be codified using C++0x’s Concepts.