Many of the standard library algorithms operate on ranges, where a range is defined as a pair of iterators [Aust1999]. This abstraction is very powerful, and has been exploited to the degree that much of the STL, and, therefore, much of modern C++, relies upon it.
An example of this might be in a simple program to read in integers into a vector:
std::fstream f("integers.dat", std::ios::in | std::ios::out); std::copy( std::istream_iterator<int>(f) , std::istream_iterator<int>() , std::back_inserter(v2));
In this case, the second argument is a default-constructed iterator that acts as an indicator for the end of range. The two iterators are not connected in a physical sense; the implementation of ...