#include <vector>
using std::vector;
int main()
{
vector<Date> e;
copy(istream_iterator<Date>(cin), istream_iterator<Date>(), back_inserter(e));
// the find() algorithm returns its second argument(e.end()) if the value is not found.
// one-past-the-end. it is not a valid iterator.
vector<Date>::iterator first = find(e.begin(), e.end(), "01/01/95");
vector<Date>::iterator last = find(e.begin(), e.end(), "12/31/95");
*last = "12/30/95"; //
// [first, last). first == e.end();?
copy(first, last, ostream_iterator<Date>(cout, "\n"));
// C++ language doesn't allow you to modify temporaries of builtin type.
// Date* f();
// p = --f(); error, but could be "f() -1"
// second: e is empty? the iterator before e.end() will not be a valid iterator.
e.insert(--e.end(), TodaysDate());
// a vector grows so that it won't have to reallocate its buffer every time you insert
// something into it. However, sometimes the vector will be full, and adding something
// will trigger a reallocation.
copy(first, last, ostream_iterator<Date>(cout, "\n"));
// to summarize:
// 1. *e.end() 2. lifetimes
// 3. valid ranges: [first, last) and point into same container
// 4. illegal builtin manipulation.
}