Подтвердить что ты не робот

Как выполнить парную двоичную операцию между элементами двух контейнеров?

Предположим, что у меня есть два вектора std::vector<uint_32> a, b;, которые, как я знаю, имеют одинаковый размер.

Существует ли парадигма С++ 11 для выполнения bitwise-AND между всеми членами a и b и помещением результата в std::vector<uint_32> c;?

4b9b3361

Ответ 1

Лямбда должна сделать трюк:

#include <algorithm>
#include <iterator>

std::transform(a.begin(), a.end(),     // first
               b.begin(),              // second
               std::back_inserter(c),  // output
               [](uint32_t n, uint32_t m) { return n & m; } ); 

Еще лучше, благодаря @Pavel и полностью С++ 98:

#include <functional>

std::transform(a.begin(), a.end(), b.begin(),
               std::back_inserter(c), std::bit_and<uint32_t>());

Ответ 2

Если вы собираетесь делать это много, на больших массивах, посмотрите библиотеки линейной алгебры, упомянутые в https://stackoverflow.com/search?q=valarray. Многие из них воспользуются специальными инструкциями, чтобы быстрее получить ответ.

Ответ 3

Просто идея, а не С++ 11: Может быть, вы можете проходить через массивы по 8 байт за раз, используя uint_64, хотя фактический массив состоит из 32-битных целых чисел? Тогда вы не будете полагаться, например. SSE, но все равно быстро выполняются на многих процессорах с 64-разрядными регистрами.