It is pretty much just historical. Strings and vectors were developed in parallel with a little thought about how they can be considered the same for T==char.
This also explains why standard containers are nice and versatile, while it std::basic_stringis a complete monolith of a member function after a member function.
, std::basic_string<T, Alloc> std::vector<T, Alloc> . , . , , GCC , .
std::string::end() ( '\0' ) . .c_str() std::vector<char> .
tl; dr: , ,