В чём преимущество функций над методами контейнеров?
Ну, прямо сразу мы получаем возможность вызывать std::size() еще и для C-массивов, кроме стандартных контейнеров.
Также, для нестандартных контейнеров, доступа к коду которых нет, всегда можно добавить свободные функции begin(), end(), size() , в отличие от методов.
С точки зрения производительности преимуществ нет, скорее наоборот - контейнер некоторые операции может выполнить быстрее исходя из особенностей внутреннего строения. Такие функции хороши для обобщенного кода. Но это в общем, для приведенных примеров разницы нет.