General programming is the concept of making your code as generic as feasible.
As seen in the iterator examples above, we define a common set of functionality that a type must have in order to be termed an iterator, and then we design algorithms that operate with any iterator type.
In conventional object-oriented programming, iterators must "prove" that they are iterators by inheriting from some form of IIterator interface.
We would lose genericity if we were unable to use raw pointers as iterators.
We don't require the official interface in C++ because we're using generic programming.
We just create the algorithms in the form of templates, so they take any type that happens to look like an iterator, regardless of where, when, or how they're defined, or whether they derive from a common base class or interface.