c ++ повторяет N итераций - PullRequest
0 голосов
/ 28 февраля 2019

Я могу явно сделать что-то вроде этого:

for(int i = 0; i < 10000; i++)
    testIteration();

Но есть ли функции std, которые делают подобное в одной строке?Примерно так:

std::repeat(10000, testIteration);

Ответы [ 4 ]

0 голосов
/ 04 сентября 2019

А как насчет простого определения макроса?#define FOR(N, foo, ...) for (int _i = 0; _i < N; _i++) foo(__VA_ARGS__);

Например,

#include <iostream>

#define FOR(N, foo, ...) for (int _i = 0; _i < N; _i++) foo(__VA_ARGS__);

void bar(int a, int b)
{
    std::cout << "hello " << a+b << std::endl;
}

int main()
{
    FOR(5, bar, 12, 6);
    return 0;
}

Выход:

hello 18
hello 18
hello 18
hello 18
hello 18
0 голосов
/ 28 февраля 2019

В предлагаемом стандарте для C ++ 20 есть пример для iota_view:

for (int i : iota_view{1, 10})
  cout << i << ' '; // prints: 1 2 3 4 5 6 7 8 9

Но сейчас библиотека range-v3 можно использовать:

for (int _ : view::iota{0, 10})
    testIteration();            // calls testIteration 10 times.
0 голосов
/ 05 апреля 2019

Лично мне нравится использовать небольшую вспомогательную функцию для этого.

template <typename F>
void repeat(size_t n, F f) {
  while (n--) f();
}

int main() {

   repeat(1000, [&] {
      testIteration();
   });
}

Это позволяет избежать необходимости прописывать имя переменной.Я предпочитаю использовать view :: iota, когда мне нужно имя, хотя.

При этом мне сказали, что читать смущает, и каждый может прочитать цикл for, так что это, вероятно, путь.(Если функция не помещена в std :: конечно).

0 голосов
/ 28 февраля 2019

Но есть ли функции std, которые выполняют аналогичные функции в одной строке?

Нет, в стандартной библиотеке нет алгоритма для этого (по крайней мере, ничего, что не требовало быписать бесполезный шаблон).Как уже упоминалось, цикл является наиболее читаемым и наименее запутанным способом сделать «что-то» n раз.

При этом, если вы возьмете это за упражнение для получения более краткого синтаксиса, вы можете написатьthis:

#include <iostream>
struct my_counter {    
    int stop;
    struct iterator {
        int count;    
        iterator& operator++() { ++count; return *this; }
        int operator*() { return count;}
        bool operator!=(const iterator& other) { return count != other.count; }
    };
    iterator begin() { return {0}; }
    iterator end() { return {stop};}    
};

void print() { std::cout << "x"; }

int main() {
     for (auto x : my_counter{5}) print();
}

Однако я бы настоятельно рекомендовал не использовать что-то подобное.Все знают, как работает цикл и что он делает.При использовании для циклов for вы можете мгновенно прочитать цикл for, в то время как все остальное необычно, удивительно и запутанно, если, конечно, не существует стандартного алгоритма (хотя я сомневаюсь, что алгоритм для этого конкретного случая будет полезен),Зачем изобретать велосипед, если можно использовать петлю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...