Лучший способ -
begin(container)
end(container)
, потому что он более расширяемый.Например, вычет аргумента шаблона может использоваться для определения размера статического массива, и, следовательно, begin(my_static_array)
и end(my_static_array)
будут работать.
В более общем случае вы можете добавить перегрузки / специализации для начала (.) Конца(.) и используйте неизменяемые устаревшие типы в универсальных алгоритмах.
Вам действительно нужно беспокоиться об этом, только если вы сами пишете универсальный алгоритм
template <typename T>
void foo (T & t)
{
bar (begin(t), end(t)); // certainly better than bar(t.begin(), t.end())
}
В клиентском коде это не 'это не имеет большого значения.На самом деле, я бы сказал, не используйте новую форму в этом случае - я хотел бы зарезервировать определенные стили / идиомы для определенных обстоятельств, разделить мое мышление.Но это только я.
for (auto i = c.begin(); i != c.end(); ++i)
// I can see at-a-glance that c is a STL-style container.
// That might be useful to know. I can probably dismiss static arrays
// and unorthodox containers as possibilities.
foo (i, c.size());