Как использовать std :: for_each поверх std :: array <> и применить лямбда-функцию к каждому элементу? - PullRequest
0 голосов
/ 03 декабря 2018

Я хочу объединить эти три функции вместе:

  • std :: for_each
  • std :: array
  • лямбда-функция

в один пример с использованием C ++ 11.

std::for_each(arr, arr + sizeof(arr) / sizeof(int), [&](int x) { std::cout<<x<<" ";});

Как преобразовать этот код для работы над std::array?

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Ответ довольно популярен в интернете.Я взял из std :: array в действии

Дано:

std::array<int, 8> arr{1, 2, 3, 4, 5, 6, 7, 8};

Или даже:

int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};

Использование for_each иlambda:

std::for_each(std::begin(arr), std::end(arr), [](int v){std::cout << v << " ";});

или даже:

// calculate the sum of the array by using a global variable
int sum = 0;
std::for_each(std::begin(arr), std::end(arr), [&sum](int v) { sum += v; });
std::cout << "sum of array{1,2,3,4,5,6,7,8}: " << sum << std::endl;

Обновлено

Использование std::begin() и std::end() вместо .begin() и .end() в соответствии с предложением @ NathanOliver.

0 голосов
/ 03 декабря 2018

Вы хотите array :: begin и array :: end массива, для двух первых параметров for_each(), которые будут отмечатьначало и конец массива.

Тогда третий параметр - это функция, в вашем случае лямбда-функция, например:

std::for_each(myarray.begin(), myarray.end(), [](int x) { std::cout << x <<" "; });

PS: для более общего подхода вы можете использовать std::begin() и std::end(), поэтому при изменении контейнера (например, с std::array на std::vector) этот код можно оставить без изменений.

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