2011-12-16 9 views

cevap

29

hile yapmak gerekir Bir lambda:

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

Daha da iyisi, @Pavel sayesinde ve tamamen C++ 98: gidiyorsanız

#include <functional> 

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

Lanet olsun, çift giriş versiyonunu tamamen unuttum! – Xeo

+0

+1 harika! Bu çözüm, b en az bir, doğru olduğu sürece en az bir sonuç verir gibi görünüyor. – kfmfe04

+0

@ kfmfe04: Doğru. 'B.begin() 'a.end() - a.begin()' adımlarını ilerletir. – Xeo

1

bu çok yapıyor gibi , büyük dizilerde, https://stackoverflow.com/search?q=valarray'da belirtilen lineer cebir kitaplıklarını kontrol edin. Birçoğu, cevabı daha hızlı almak için özel talimatlardan faydalanacak.

+1

Ne yazık ki, bu bir uygulama kalitesi sorunudur ve gördüğüm çoğu C++ uygulaması gerçekten de valarray'ı optimize etmeyi denememektedir. Aslında bildiğim tek şey CPU vektör op kodlarını kullanmak için onu optimize ediyor ve Intel C++. –

+0

@Jeffrey +1 ilginç - bu BLAS'ın yerini alması anlamına mı geliyor? – kfmfe04

+0

@ kfmfe04 Diğer yoldan. valarray genel bir fikirdir, ancak 1998'den beri vardır ve uBLAS (http://www.boost.org/libs/numeric/ublas/doc/index.htm) gibi diğer doğrusal cebir kütüphaneleri daha iyi olma eğilimindedir. Bağlantılı olduğum aramada bahsedilen sorularda, insanlar başka kütüphaneler önermektedir. –

0

Sadece bir fikir değil, C++ 11 belirli: Belki de gerçek dizisi 32 bit tam sayılardan oluşuyor olsa da, uint_64 kullanarak bir seferde 8 baytlık dizilerden geçebilirdiniz? O zaman, örneğin SSE, ama hala 64-bit geniş yazmaçlara sahip birçok CPU üzerinde hızlı yürütme.

İlgili konular