2011-12-16 9 views

Odpowiedz

29

lambda powinno załatwić sprawę:

#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; }); 

Nawet lepiej, dzięki @Pavel i całkowicie C++ 98:

#include <functional> 

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

Cholera, zupełnie zapomniałem wersji z podwójnym wejściem! – Xeo

+0

+1 fantastyczny! To rozwiązanie wygląda na to, że nadal da wynik, o ile b jest co najmniej tak samo ważne, prawda? – kfmfe04

+0

@ kfmfe04: Prawidłowo. Przewija kroki 'b.begin()' 'a.end() - a.begin()'. – Xeo

1

Jeśli masz zamiar robić to dużo , na dużych tablicach, sprawdź biblioteki algebry liniowej wymienione w https://stackoverflow.com/search?q=valarray. Wielu z nich skorzysta ze specjalnych instrukcji, aby szybciej uzyskać odpowiedź.

+1

Niestety jest to problem związany z jakością implementacji, a większość implementacji C++, które widziałem, nie próbuje zoptymalizować walari. Jedyne, co znam, to w rzeczywistości optymalizuje go do używania wektorowych kodów procesorów, a takim jest Intel C++. –

+0

@Jeffrey +1 ciekawe - czy ma to zastąpić BLAS? – kfmfe04

+0

@ kfmfe04 W inny sposób. valarray jest ogólną ideą, ale pochodzi z roku 1998, a inne biblioteki algebry liniowej, takie jak uBLAS (http://www.boost.org/libs/numeric/ublas/doc/index.htm) wydają się być lepsze. W pytaniach wspomnianych przy wyszukiwaniu, które łączyłem, ludzie sugerują kilka innych bibliotek. –

0

Tylko jeden pomysł, a nie specyficzny dla C++ 11: Może mógłbyś przejść przez tablice po 8 bajtów na raz używając uint_64, mimo że rzeczywista tablica składa się z 32-bitowych liczb całkowitych? Wtedy nie można polegać na np. SSE, ale nadal szybko wykonuje się na wielu procesorach, które mają 64-bitowe rejestry.

Powiązane problemy