[C++] Когда использовать std :: begin и std :: end вместо контейнеров конкретных версий


Answers

Версия бесплатной функции является более общей, чем функция-член контейнера. Я бы использовал его, вероятно, в общем коде, где тип контейнера неизвестен раньше (и может быть массивом). В остальной части кода (т. c.begin() Когда контейнер фиксирован и известен), я бы, вероятно, использовал c.begin() из-за инерции. Я бы ожидал, что новые текстовые книги на C ++ рекомендуют версию бесплатной функции (поскольку она никогда не бывает хуже и иногда лучше), но это должно догнать обычное использование.

Question

Существуют ли какие-либо общие предпочтения или правила, которые объясняют, когда вместо конкретных функций следует использовать контейнеры конкретных версий начала и std::end ? std::begin и std::end ?

Я понимаю, что если функция является шаблоном, в соответствии с которым тип контейнера является параметром шаблона, тогда следует использовать std::begin и std::end , то есть:

template<class T> void do_stuff( const T& t )
{
    std::for_each( std::begin(t), std::end(t), /* some stuff */ );
}

Как насчет в других сценариях, таких как стандартная функция / член, где известен тип контейнера? По-прежнему лучше использовать std::begin(cont) и std::end(cont) или должны быть предпочтительными функции- cont.begin() контейнера cont.begin() и cont.end() ?

Правильно ли я полагаю, что в производительности нет выгоды, вызвав cont.end() через std::end(cont) ?