When a container reallocates its elements, their addresses change correspondingly. Consequently, the values of existing iterators are invalidated:
#include #include using namespace std;void main() { list payroll; payroll.push_back(5000.00); list::iterator p = payroll.begin(); //p points to the first element for (int i = 0 ; i < 10; i++) { payroll.push_back(4500.00); //insert 10 more elements to payroll; reallocation may occur } // DANGEROUS cout << "first element in payroll: "<< *p <
In this example, it may well be the case that payroll reallocated itself during the insertion of 10 additional elements, and as a result invalidated the value of p. Using an invalid iterator yields undefined behavior. It's exactly as if you were using a pointer with the address of a deleted object. To be on the safe side, you should re-assign the iterator's value:
for (int i = 0 ; i < 10; i++) { payroll.push_back(4500.00); //insert 10 more elements to payroll; reallocation may occur} p = payroll.begin(); // re-assign p cout <<"first element in payroll: "<<*p<