2011-12-16 4 views
17

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

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

+0

Просмотреть обновление благодаря @Pavel - pure C++ 98! –

ответ

29

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

#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>()); 
+0

Черт, я полностью забыл двойную входную версию! – Xeo

+0

+1 фантастический! Это решение похоже, что оно все равно даст результат, если b по крайней мере до тех пор, пока a, правильно? – kfmfe04

+0

@ kfmfe04: Правильно. Он выполнит шаги 'b.begin()' 'a.end() - a.begin()'. – Xeo

1

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

+1

К сожалению, это проблема с качеством реализации, и большинство реализаций на C++, которые я видел, на самом деле не пытаются оптимизировать valarray. Единственный, кого я знаю, фактически оптимизирует его, чтобы использовать коды кода процессора, и это Intel C++. –

+0

@Jeffrey +1 интересный - это значит заменить BLAS? – kfmfe04

+0

@ kfmfe04 Другой способ. valarray - общая идея, но она датируется 1998 годом, и другие библиотеки линейной алгебры, такие как uBLAS (http://www.boost.org/libs/numeric/ublas/doc/index.htm), как правило, лучше. В вопросах, упомянутых в поиске, с которым я связан, люди предлагают несколько других библиотек. –

0

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

Смежные вопросы