Каков рекомендуемый способ итерации контейнера в C ++ 11? - PullRequest
26 голосов
/ 09 января 2012

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

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

container.begin() and container.end()

Или

begin(container) and end(container)

Если есть, то когда это предпочтительнеенад другим?

Ответы [ 2 ]

37 голосов
/ 09 января 2012

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

 for (auto item : container)

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

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

24 голосов
/ 09 января 2012

Лучший способ -

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());
...