Отказ от цикла for в C ++

0

Недавно, во время кодирования, я обнаружил, что снова повторяю то же самое для заголовка цикла:

for (int i = 0; i < [somevalue]; i++)
{
    [other code]
}

Кто-нибудь знает, как перегрузить цикл for, или определить другое ключевое слово, чтобы оно принимало число и подавало его через заданный цикл, чтобы аббревиатура означала следующее:

for ([somevalue])
{
    [other code]
}

или

nfor ([somevalue])
{
    [other code]
}

Потому что просто писать for(12) все время и пробивать код через 12 раз было бы намного приятнее

  • 2
    В зависимости от того, что является othercode , вам может быть лучше использовать алгоритмы из стандартной библиотеки C ++, такие как for_each или transform .
  • 0
    В IDE, как в Eclipse, есть это с дополнением кода. Он заполняет цикл for из шаблона, и вы просто вставляете значения.
Теги:
c++11
for-loop

7 ответов

3
Лучший ответ

Или, если вы хотите использовать простые старые макросы, можете сделать

#define nfor(somevalue) for(int i = 0; i < somevalue; ++i)

Затем используйте его как

nfor(10)
{
    cout << "Hello World " << i << "!" << endl;
}
  • 0
    Я собирался начать писать ответ, используя лямбды, но это намного проще и соответствует желаемому синтаксису.
  • 0
    ну, зависит от того, что вы подразумеваете под лучше. Лямбда-подход - это чистый C ++ и не подразумевает препроцессор, поэтому он «чистый», однако он быстро выполняет свою работу. однако, лямбда-подход скрывает счетчик от цикла, если вы не сделаете его статичным
Показать ещё 4 комментария
6

Вы можете сделать свой собственный for метода, который принимает объект функции:

template <class F>
void for_t(std::size_t n, F const& f)
{
    while (n--)
        f();
}

int main()
{
    int count = 0;
    for_t(5, [&] { std::cout << ++count << " "; });
}
  • 0
    @ 0x499602D2 Зачем вводить весь объем? просто не используйте [&count] предоставляя функции доступ к тем вещам, которые ей не нужны.
  • 0
    @ 0x499602D2: Upvote остается. :)
Показать ещё 5 комментариев
4

Или используя диапазоны (и усиление):

for(int i : boost::counting_range(0, limit))
    /* do nice things */ ;

повышение :: counting_range

1
class until {
public:
    until(int limit) : count(limit) {}
    int operator*() const { return count; }
    until &operator++() { ++count; return *this; }
    bool operator!=(const until &rhs) const { return count != rhs.count; }
    until begin() const { return 0; }
    until end() const { return count; };

private:
    int count;
};

#include <iostream>

int main() {    
    for (int count : until(5)) {
        std::cout << count << ' ';
    }
}

N3853: Диапазоны, основанные на диапазонах, следующее поколение будет делать for терьера.

0

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

#define nfor(varname, somevalue) for(int varname = 0; varname < somevalue; ++varname)

Таким образом, вы можете иметь вложенные для циклов, используя выше макрос:

nfor(i, 10)
{
    nfor(j, 10)
    {
        cout << i << " " << j;
    }
}
0

Это невозможно в цикле for в C++. Есть два способа сделать то, что вы хотите.

Первое - использовать последнее дополнение к семейству for loop, представленному в C++ 11.

for(int x : (int[12]){}){
    // Do stuff
}

Не совсем то, что вы хотите, но все же немного короче. Другой вариант - сделать вашу собственную функцию и позволить ей принимать размер и функцию. 0x499602D2 избили меня в этой части, поэтому см. Их сообщение о том, как это сделать.

  • 1
    Кажется расточительным выделять память (даже в стеке) для этой цели, особенно если количество итераций очень велико.
0

Например,

template< class Func >
void repeat( int const n, Func const& f )
{
    for( int i = 1; i <= n; ++i ) { f(); }
}

void foo()
{
    int n = 1;
    repeat( 12, [&]
    {
        // other code, e.g.
        cout << n++ << endl;
    } );
}

Отказ от ответственности: код не тронут руками компилятора.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню