Why the at? That's an advanced feature, for the special (and
rare) cases where you want an exception on a bounds error,
instead of a crash.
If you prefer a crash, why not use raw arrays and have out of bounds
crashes all the time?
You seem to believe that the only advantage to using a std::vector
rather than a raw array is the at() member function.