2011-12-16 11 views
17

मान लीजिए मेरे पास दो वैक्टर std::vector<uint_32> a, b; हैं जो मुझे एक ही आकार के बारे में पता है।मैं दो कंटेनर के तत्वों के बीच एक जोड़ी बाइनरी ऑपरेशन कैसे करूं?

वहाँ a और b के सभी सदस्यों के बीच एक bitwise-AND कर रही है, और std::vector<uint_32> c; में परिणाम डालने के लिए एक सी ++ 11 प्रतिमान है?

+0

अपडेट को देखें @Pavel - शुद्ध सी ++ 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 करने के लिए धन्यवाद और पूरी तरह से सी ++ 98:

#include <functional> 

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

अरे, मैं पूरी तरह से डबल इनपुट संस्करण भूल गया! – Xeo

+0

+1 शानदार! यह समाधान ऐसा लगता है कि यह तब तक परिणाम देगा जब तक बी कम से कम लंबे समय तक सही हो, सही? – kfmfe04

+0

@ kfmfe04: सही। यह 'b.begin()' a.end() - a.begin() 'चरणों को आगे बढ़ाएगा। – Xeo

1

आप जा रहे हैं यह एक बहुत कुछ कर किया जाना है , बड़े सरणी पर, https://stackoverflow.com/search?q=valarray में वर्णित रैखिक बीजगणित पुस्तकालयों की जांच करें। उनमें से कई उत्तर तेजी से प्राप्त करने के लिए विशेष निर्देशों का लाभ उठाएंगे।

+1

दुर्भाग्य से यह एक गुणवत्ता-कार्यान्वयन मुद्दा है, और मैंने देखा है कि अधिकांश सी ++ कार्यान्वयन वास्तव में valarray अनुकूलित करने की कोशिश नहीं करते हैं। केवल एक ही मुझे पता है कि वास्तव में इसे CPU वेक्टर ऑपकोड का उपयोग करने के लिए अनुकूलित करता है और यह इंटेल सी ++ है। –

+0

@ जेफरी +1 दिलचस्प - क्या इसका मतलब बीएलएएस को प्रतिस्थापित करना है? – kfmfe04

+0

@ kfmfe04 आसपास के अन्य तरीके। वालराय सामान्य विचार है, लेकिन यह 1 99 8 से है, और अन्य रैखिक बीजगणित पुस्तकालयों जैसे यूब्लैस (http://www.boost.org/libs/numeric/ublas/doc/index.htm) बेहतर होते हैं। मैंने जिस खोज से लिंक किया है, उसमें उल्लिखित प्रश्नों में, लोग कई अन्य पुस्तकालयों का सुझाव देते हैं। –

0

बस एक विचार, सी ++ 11 विशिष्ट नहीं: शायद आप Uint_64 का उपयोग कर एक बार में 8 बाइट्स के माध्यम से कदम उठा सकते हैं, भले ही वास्तविक सरणी 32-बिट पूर्णांक से बना है? तो आप उदासी पर भरोसा नहीं करेंगे एसएसई, लेकिन अभी भी कई सीपीयू पर तेजी से निष्पादन मिलता है जिसमें 64-बिट चौड़े रजिस्ट्रार हैं।

संबंधित मुद्दे