Какой рекомендуемый способ итерации контейнера в С++ 11?
Какой рекомендуемый способ итерации контейнера в С++ 11?
Использование
container.begin() and container.end()
или
begin(container) and end(container)
Если какой-либо, когда один предпочтительнее другого?
Ответ 1
Лучший способ -
begin(container)
end(container)
потому что он более расширяемый. Например, вывод аргумента шаблона может использоваться для определения размера статического массива и, следовательно, begin(my_static_array) и end(my_static_array) будут работать.
В более общем плане вы можете добавить перегрузки/специализации для начала (.) end (.) и использовать неизменные устаревшие типы в общих алгоритмах.
Вам действительно нужно только беспокоиться об этом, если вы пишете общий алгоритм
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());