Как выполнить парную двоичную операцию между элементами двух контейнеров?
Предположим, что у меня есть два вектора std::vector<uint_32> a, b;
, которые, как я знаю, имеют одинаковый размер.
Существует ли парадигма С++ 11 для выполнения bitwise-AND
между всеми членами a
и b
и помещением результата в std::vector<uint_32> c;
?
Ответы
Ответ 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-разрядными регистрами.