В С++ существует ли способ вызвать функцию для каждого элемента вектора, не используя цикл, проходящий по всем векторным элементам? Что-то похожее на "карту" в Python.
Вызов функции для каждого элемента вектора С++
Ответ 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++; });
Ответ 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, который берет пару итераторов, функцию или функтор.