Узнать индекс элемента контейнера

172
23 февраля 2019, 07:20

Хочу написать параллельный 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 = ???
                                      // ...
                                   }
);
Answer 1
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;
          // ...
      }
);
READ ALSO
QLayout не изменяет размеры виджета

QLayout не изменяет размеры виджета

При изменении размеров родительского окна, меняется размер только у одного виджетаНеобходимо, чтобы они изменялись одновременно

156
Не запускается Debug при использовании QCameraViewfinder

Не запускается Debug при использовании QCameraViewfinder

Господа! Хочу обратить ваше внимание на следующюю проблемуЕсть небольшой код:

166
использование контейнера map

использование контейнера map

как я могу реализовать такую конструкцию ?

152
Не работает if else c++

Не работает if else c++

Если сумма 3 действительных чисел x,y,z <1, то наименьшее из этих чисел заменить полусуммой двух других, в противном случае заменить меньшее...

180