I think you may be reading too much into your assignment, but your questions do bear consideration nonetheless.
First of all, some considerations:
- there are both mutating and non-mutating iterators (
iterator
andconst_iterator
nested types in general), the former allowing writing to the pointed-to element, and the latter not. - iterators are supposed to be lightweight, they are copied over and over in many algorithms
Now, with regard to your questions, there is indeed a design decision on whether to perform bounds checking or not.
In general, iterators in C++ are so lightweight that they perform no bounds checking at all. This is the name of efficiency and the you don't pay for what you don't use philosophy. If the user ever overshoot... she will fall prey to Undefined Behavior, that is anything could happen.
However, most (if not all) STL implementations will also acknowledge the issue and provide a debug mode (checked mode) that you can use when testing your application; of course those induce an additional cost, not only CPU-wise but also potentially memory-wise.
As such, it is your own choice whether to provide checks, or not, and possibly to provide it optionally. I would recommend starting off without checks, and only tack them on later on as you have a better idea of what the system looks like.