Подтвердить что ты не робот

Какой рекомендуемый способ итерации контейнера в С++ 11?

Какой рекомендуемый способ итерации контейнера в С++ 11?

Использование

container.begin() and container.end()

или

begin(container) and end(container)

Если какой-либо, когда один предпочтительнее другого?

4b9b3361

Ответ 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());

Ответ 2

Я думаю, что новый синтаксис с диапазон, основанный на циклах

 for (auto item : container)

вероятно, является наиболее похожим на С++ 11.

Как прокомментировали другие, вы иногда хотите auto& или const auto& вместо auto.