Built-in arrays map numbers 0-N to a value. N must be known at compile time.
std::vector<> maps numbers 0-N to a value. N is determined at runtime and can change during the program.
std::map<> maps an arbitrary key to a value. The only restriction on the key type is that it must support a weak ordering (i.e. you must be able to compare two keys to see if one is less than the other).