I'll warn you about using binary search on unsorted data. This produces wrong results silently with no error message. Always sort before using binary search or bounds. Another common mistake with unique: forgetting to erase the duplicates afterward.
The vector size doesn't change automatically. You must call erase on the returned iterator. Never dereference end() iterators returned from find or bounds. Always check it != v.end() before accessing *it.
Dereferencing end() causes undefined behavior and crashes.