Как выполнить попарно бинарную операцию между элементами двух контейнеров? - PullRequest
17 голосов
/ 17 декабря 2011

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

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

Ответы [ 3 ]

29 голосов
/ 17 декабря 2011

Лямбда должна делать свое дело:

#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 и полностью C ++ 98:

#include <functional>

std::transform(a.begin(), a.end(), b.begin(),
               std::back_inserter(c), std::bit_and<uint32_t>());
1 голос
/ 17 декабря 2011

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

0 голосов
/ 13 сентября 2014

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

...