Циклы foreach в стиле PHP в C ++ - PullRequest
1 голос
/ 04 марта 2011

Возможно ли реализовать это с помощью шаблонов, предпочтительно таким образом, чтобы они работали с векторами и массивами, но особенно с векторами.

  • Основная функциональность, используемая в PHP как:

    foreach(objects as object)
    { object=this*that; }
    
  • Было бы неплохо использовать альтернативное использование, если это возможно:

    foreach(objects as key => object)
    { object=formula(key); }
    

=> не является необходимым.Помимо шаблонов, любая техника, будет приемлемой, учитывая этот формат.

Ответы [ 4 ]

6 голосов
/ 04 марта 2011

C ++ 0x поддерживает на основе диапазона для :

for (T& object : objects)
   object = this * that;

но пока не многие компиляторы поддерживают это (только у gcc 4.6 есть AFAIK). Тем не менее, вы можете использовать std::for_each с лямбда-функцией, такой как:

std::for_each(objects.begin(), objects.end(), [](T& object) {
   object = this * that;
});

Если вам не нравится C ++ 0x, вы можете использовать Boost.Foreach вроде

BOOST_FOREACH(T& object, objects) {
  object = this * that;
}

Для std::vector встроенная поддержка формы => отсутствует. Вам нужно вести индекс самостоятельно.

int key = 0;
for (T& object : objects) {
   object = formula(key);
   ++ key;
}

key = 0;
std::for_each(objects.begin(), objects.end(), [&key](T& object) {
   object = formula(key);
   ++ key;
});
2 голосов
/ 04 марта 2011

Здесь и здесь .

STL и Boost оба обеспечивают foreach.

1 голос
/ 04 марта 2011

C ++ 0x представляет синтаксис для итерации по любому контейнеру, который имеет итераторы begin() и end(), который включает в себя любой контейнер STL, такой как vector:

for (auto& object : objects)
    object = this * that;

. Вы также можете использовать begin() и end() явно и разыменуйте итератор самостоятельно, или используйте std::for_each() с лямбда-выражением:

#include <algorithm>
std::for_each(objects.begin(), objects.end(), [](Object& object) -> void {
    object = this * that;
});
1 голос
/ 04 марта 2011

Если вам нужен оператор foreach в C ++, вы можете взглянуть на исходный код Qt, у них есть реализации, которые работают с директивой препроцессора (Macro) и выглядят примерно так:

foreach(element,collection)
{
  //some code to work with element.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...