Below is the most common implementation of std::swap:
template<typename T>
void std::swap(T& a, T& b) {
auto tmp = std::move(a);
a = std::move(b);
b = std::move(tmp);
}
The C++ standard requires the time complexity of std::swap must be constant. So, if a container type, such as std::vector, std::list, and the like, has correctly implemented its move-ctor & move-assignment-operator; then, it doesn't seem necessary to define a swap member function for the type.
However, every container type in std namespace has defined its own swap member function, or a specialization of std::swap. I think there must be a concrete rationale behind the design, what's that?
std::swap()) would do move/copy/swap of individual elements in some [not all] cases. The member functions are specified to not do any move/copy/swap of individual elements.