Что предпочтительнее для каждого, в или for_each? - PullRequest
3 голосов
/ 07 февраля 2012

При использовании Visual Studio я могу написать обход контейнера, по крайней мере, следующими тремя способами.Какой способ предпочтительнее?Предполагается:

vector<CString> strings1;

Метод 1 (с использованием алгоритма for_each с лямбда-выражением:

for_each(strings1.begin(), strings1.end(), [](CString s){
   _tprintf(_T("%s"), s);
}

Метод 2 (с использованием for each, in, для Microsoft):

for each(auto s in strings1)
{
   _tprintf(_T("%s"), s);
}

Метод 3 (обработать вектор с помощью синтаксиса массива):

for (int i=0; i<v.size(); ++i)
{
   _tprintf(_T("%s"), v[i]);
}

Я знаю, что метод 2 не является переносимым, но мне не важно быть переносимым. Это нужно только для работы вОкна.

Ответы [ 3 ]

5 голосов
/ 07 февраля 2012

В C ++ 11 вы можете использовать диапазон, для которого аналогично методу 2, но стандартному.

http://www2.research.att.com/~bs/C++0xFAQ.html#for

3 голосов
/ 08 февраля 2012

Как отметил Стефан Т. Лававей всего пару дней назад на конференции «GoingNative 2012», «официальный» цикл на основе диапазона будет частью бета-версии новой версии, которая скоро будет выпущена. Visual Studio. Так что это будет путь:

for(auto s : strings1)
{
   _tprintf(_T("%s"), s);
}

или используйте ссылку, чтобы уменьшить затраты на копирование для использования по значению:

for (auto &s : strings1)  ....

Редактировать: упомянутый выше доклад GoingNative можно найти здесь

1 голос
/ 08 февраля 2012

Хотя я думаю, что синтаксис второго варианта более понятен, я лично предпочел бы избежать его, поскольку он основан на более ранней версии проекта стандарта и, следовательно, может измениться в будущем.YMMV, хотя, поскольку это в основном вопрос вкуса.

...