Хочу написать параллельный 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;
// ...
}
);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
При изменении размеров родительского окна, меняется размер только у одного виджетаНеобходимо, чтобы они изменялись одновременно
Господа! Хочу обратить ваше внимание на следующюю проблемуЕсть небольшой код:
Если сумма 3 действительных чисел x,y,z <1, то наименьшее из этих чисел заменить полусуммой двух других, в противном случае заменить меньшее...