2013-08-28 8 views
9

C++ में से एक वेक्टर में पूर्णांक के दो वैक्टर कन्वर्ट एक ही लंबाई के साथ करता है, तो मैं दो int की वैक्टर है:, सी में पूर्णांक के जोड़े ++

A = [1, 2, 3 ,4]; 
B = [1, 2, 3, 4]; 

कैसे मैं उन्हें जोड़े में से एक वेक्टर में विलय कर सकते हैं:

[(1,1), (2,2), (3,3), (4, 4)] 

बेशक मैं इसे लूप के साथ कर सकता हूं। लेकिन क्या हम उपयुक्त एसटीएल कार्यों और इटरेटर्स का उपयोग कर ऐसा कर सकते हैं?

+1

बूस्ट में मुझे लगता है कि, http://stackoverflow.com/questions/8511035/sequence-zip-function-for-c11 –

+0

http://stackoverflow.com/questions/17287107/pythons-zip-equivalent-in -सी-या-सी –

उत्तर

20

आप इस के लिए एक एल्गोरिथ्म का उपयोग कर सकते हैं:

std::vector<std::pair<int, int>> target; 
target.reserve(A.size()); 
std::transform(A.begin(), A.end(), B.begin(), std::back_inserter(target), 
       [](int a, int b) { return std::make_pair(a, b); }); 
+2

ध्यान दें कि यह वास्तव में एक लूप से छुटकारा पाने में मदद नहीं करता है। लूप सिर्फ 'std :: transform()' में छिपा होगा। इस विशेष मामले में एक स्पष्ट लूप भी छोटा और स्पष्ट होगा। – Karadur

+13

@ करडुर: आप तत्वों पर किसी भी तरह से बिना किसी तत्व के एन तत्वों के लिए एक ऑपरेशन लागू नहीं कर सकते हैं, यह केवल स्पष्ट है: दो अनुक्रमों को ज़िपित करना ओ (1) में नहीं किया जा सकता है। सवाल यह भी स्पष्ट है कि वांछित क्या है: * क्या हम उपयुक्त एसटीएल कार्यों और इटरेटर का उपयोग कर ऐसा कर सकते हैं? *। यह जवाब बिल्कुल ठीक है। –

+1

आप लैम्ब्डा को भी छोड़ सकते हैं और सीधे 'make_pair' का उपयोग कर सकते हैं, नहीं? – jrok

6

मैं मानता हूँ कि डिटमार Kühl के जवाब करता है बिल्कुल क्या सवाल में पूछा गया था, लेकिन मैं यह भी Kakadur की टिप्पणी से सहमत हैं। एक लूप std::transform() में छिपा हुआ है, इसलिए जटिलता समान है। कुछ लोगों का न्याय करेगा, लेकिन अगर वहाँ एक तरह से किया जा रहा है बेहतर अन्य की तुलना में का कोई प्रत्यक्ष प्रमाण है, मैं सबसे पठनीय और कम से कम वर्बोज़ संस्करण का चयन करने के लिए करते हैं:

// create a vector of length of the smaller vector 
std::vector<std::pair<int, int>> target(A.size() < B.size() ? A.size() : B.size()); 

for (unsigned i = 0; i < target.size(); i++) 
    target[i] = std::make_pair(A[i], B[i]); 

पी.एस. उपरोक्त कोड target वेक्टर के लिए पर्याप्त जगह आवंटित करता है, ताकि push_back (पुनर्वितरण के मामले में) के संभावित ओवरहेड से बचा जा सके।

+0

आप जानते हैं, 'push_back' में छिपा एक संभावित लूप भी है –

+0

ठीक है, हाँ, लेकिन यदि कोई पुनर्वितरण होता है। संकेत के लिए धन्यवाद, मैं अपना उत्तर – Oleksiy

+0

* अपडेट करूंगा * "हालांकि, अधिकांश लोगों के लिए यह संस्करण बहुत अधिक पठनीय और स्पष्ट है" * - हाँ, मानक पुस्तकालय (और इस प्रकार सी ++) से परिचित नहीं है। और यह वास्तव में सवाल का जवाब नहीं देता है, है ना? –

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