IMO there is an error in the following example posted on http://www.oreillynet.com/pub/a/network/2005/10/18/what-is-iterator-in-c-plus-plus.html?page=4 :
// Fill up v with some data
vector<string>::iterator p = v.begin();
p += 5; // Now p refers to the 5th element
p; // Now p refers to the 10th element
p -= 10; // Back to the beginning...
p will return the 10th element (which is not used), but p itself will still refer to the 5th element after doing this. Hence the subsequent statement "p -= 10" is a bug: p will point before v.begin(). I verified this by running a simple test program compiled with g++ 4.2.1 through valgrind. It did report an access violation when dereferencing p after the last statement.