2013-06-07 2 views
7

अगर वहाँ कुछ भी था मैं बस सोच रहा था (या तो C++ 11 या बढ़ावा में) है कि मुझे कुछ इस तरह करते हैं मदद कर सकता है:एल्गोरिथ्म दो श्रृंखलाओं में से मानों को जोड़ने और उन्हें रखने के लिए एक तिहाई एक

std::vector<int> v1 = {1, 2, 3}; 
std::vector<int> v2 = {2, 5, 4}; 
std::list<int> res; 
algorithm(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(res), std::plus<int>()); 

परिणाम निश्चित रूप से {3, 7, 7} होना चाहिए और जहां std :: प्लस के बजाय कोई बाइनरी_फंक्शन हो सकता है।

तो अगर किसी के पास कोई विचार है, तो मुझे बताएं।

+0

[std :: transform] (http://en.cppreference.com/w/cpp/algorithm/transform) –

उत्तर

9

आप इसके लिए std::transform के 5 पैरामीटर अधिभार का उपयोग कर सकते हैं। यह दो पर्वतमाला के तत्वों के जोड़े पर संचालित करने के लिए एक द्विआधारी functor लेता है:

std::transform(v1.begin(), 
       v1.end(), 
       v2.begin(), 
       back_inserter(res), 
       std::plus<int>()); 
+0

ओह ठीक है मुझे नहीं पता था कि पांच पैरामीटर वाला संस्करण था। मुझे बेहतर दिखना चाहिए था, बहुत बहुत धन्यवाद। –

+0

+1 जब लैम्बडा का उपयोग करने के लिए प्रलोभन का विरोध करने के लिए पहले से ही एक स्टडी फ़ैक्टर है। –

12

बस मस्ती के लिए, मैं std::vector और std::transform के लिए एक विकल्प को इंगित करेंगे। आप इसके बजाय std::valarray का उपयोग कर सकते हैं।

#include <valarray> 
#include <iostream> 

int main() { 
    std::valarray<int> a = {1, 2, 3}; 
    std::valarray<int> b = {2, 5, 4}; 

    std::valarray<int> c = a + b; // look ma, no transform! 

    for (int i=0; i<3; i++) 
     std::cout << c[i] << "\t"; 
} 

परिणाम:

3  7  7 

दुर्भाग्य से, भले ही valarrays एक साथ जोड़ने के लिए कोड सरल और साफ है, valarray कभी नहीं बहुत लोकप्रियता हासिल की है। इस प्रकार, हमें इस अजीब परिस्थिति के साथ छोड़ दिया गया है, जहां से ऊपर की तरह कोड भी मुझे बहुत साफ, सीधा और पठनीय के रूप में मारता है, अभी भी लगभग अपरिवर्तित के रूप में योग्यता प्राप्त करता है, क्योंकि बहुत कम लोग इसके आदी हैं।

+0

+1 आह वास्तव में अच्छा है, मुझे नहीं पता था कि यह एक वेक्टरीकृत सरणी थी। मैं इसे लेता हूं यह अन्य सभी अंकगणितीय ऑपरेटरों के साथ भी काम करता है। – TemplateRex

+0

आह, यह नहीं पता था कि या तो अस्तित्व में था, किसी दिन काम में आ सकता है। –

+0

@ टेम्पलेटरेक्स: हाँ, उनमें से बहुत सारे। आप वैलारे के प्रत्येक सदस्य को एक संख्या जोड़ने के लिए 'वैलरे + इंट' जैसी चीजें भी कर सकते हैं (उदाहरण के लिए, उदाहरण में, ऊपर, 'सी + 1'' 4 8 8' देगी)। –

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