Вызов функции для каждого элемента вектора С++ - программирование
Подтвердить что ты не робот

Вызов функции для каждого элемента вектора С++

В С++ существует ли способ вызвать функцию для каждого элемента вектора, не используя цикл, проходящий по всем векторным элементам? Что-то похожее на "карту" в Python.

4b9b3361

Ответ 1

Да: std::for_each.

void foo(int a) {
    std::cout << a << "\n";
}

std::vector<int> v;

...

std::for_each(v.begin(), v.end(), &foo);

Ответ 2

У вас уже есть несколько ответов, в которых упоминается std::for_each.

Пока они отвечают на заданный вами вопрос, я бы добавил, что, по крайней мере, по моему опыту, std::for_each является наименее полезным из стандартных алгоритмов.

Я использую (для примера) std::transform, который в основном a[i] = f(b[i]); или result[i] = f(a[i], b[i]); гораздо чаще, чем std::for_each. Многие люди часто используют std::for_each для печати элементов коллекции; для этой цели std::copy с std::ostream_iterator, поскольку назначение работает намного лучше.

Ответ 3

На С++ 11: Вы можете использовать лямбду. Например:

std::vector<int> nums{3, 4, 2, 9, 15, 267};

std::for_each(nums.begin(), nums.end(), [](int &n){ n++; });

ref: http://en.cppreference.com/w/cpp/algorithm/for_each

Ответ 4

Используйте for_each:

// for_each example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

void myfunction (int i) {
  cout << " " << i;
}

struct myclass {
  void operator() (int i) {cout << " " << i;}
} myobject;

int main () {
  vector<int> myvector;
  myvector.push_back(10);
  myvector.push_back(20);
  myvector.push_back(30);

  cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), myfunction);

  // or:
  cout << "\nmyvector contains:";
  for_each (myvector.begin(), myvector.end(), myobject);

  cout << endl;

  return 0;
}

Ответ 5

Если у вас есть С++ 11, существует еще более короткий метод: для диапазона. Его цель - именно это.

std::vector<int> v {1,2,3,4,5};

for (int element : v)
    std::cout << element; //prints 12345

Вы также можете применять к нему ссылки и константы, когда это необходимо, или использовать auto, когда тип длинный.

std::vector<std::vector<int>> v {{1,2,3},{4,5,6}};

for (const auto &vec : v)
{
    for (int element : vec)
        cout << element;

    cout << '\n';
} 

Вывод:

123
456

Ответ 6

Вы можете использовать std:: for_each, который берет пару итераторов, функцию или функтор.