Хочу написать параллельный for_each, но внутри мне нужно знать индекс текущего обрабатываемого элемента. Как его узнать без data race?
std::vector<int> some_container;
//... init
std::for_each(std::execution::par, some_container.begin(),
some_container.end(),
[](int curr) {
// auto curr_index = ???
// ...
}
);
std::vector<int> some_container;
//... init
std::for_each(std::execution::par, some_container.begin(),
some_container.end(),
[&](const int& curr) {
auto curr_index = &curr - some_container.data();
// ...
}
);
Более продвинутые варианты - использовать современные библиотеки range-v3,
которые, однако, несовместимы с std::for_each. Дело в том, что код ниже не будет работать из-за того, что std::begin(indexed_data) и std::end(indexed_data) имеют разный тип. Впрочем, код выглядел бы так:
using namespace ranges;
std::set<int> my_data = ...;
auto indexed_data = view::zip(my_data, view::iota(0));
std::for_each(std::execution::par,
std::begin(indexed_data),
std::end(indexed_data),
[&](const auto& p) {
auto&& [data, curr_index] = p;
// ...
}
);
Но если захочется использовать не-параллельную версию, то запросто:
ranges::for_each(indexed_data,
[&](const auto& p) {
auto&& [data, curr_index] = p;
// ...
}
);
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости