std::array is just a class version of the classic C array. Its size is fixedat compile time and it will be allocated on the stack.
std::vector is a small class containing pointers into the heap. (So when
you allocate a std::vector, it always calls new.) They are slightly slower
to access because those pointers have to be chased to get to the arrayed
data... But in exchange for that, they can be resized and they only take
a trivial amount of stack space no matter how large they are.
Fixed arrays decay into pointers, losing the array length information
when you pass it to a function.
Because it does bounds checking, at() is slower (but safer) than operator
[].
Advice would be: Use std::vector unless (a) your profiler tells you that you
have a problem and (b) the array is tiny.