2012-01-08 15 views
60

सरणी को वेक्टर में परिवर्तित करने का सबसे आसान तरीका क्या है?सरणी को वेक्टर में परिवर्तित करने का सबसे आसान तरीका क्या है?

void test(vector<int> _array) 
{ 
    ... 
} 

int x[3]={1, 2, 3}; 
test(x); // Syntax error. 

मैं int सर से वेक्टर तक x को सरल तरीके से परिवर्तित करना चाहता हूं।

उत्तर

92

vector निर्माता है कि दो iterators लेता है का उपयोग करें, ध्यान दें कि संकेत दिए गए वैध iterators हैं, और संकेत के लिए सरणियों से अंतर्निहित रूपांतरण का उपयोग करें:

int x[3] = {1, 2, 3}; 
std::vector<int> v(x, x + sizeof x/sizeof x[0]); 
test(v); 

या

test(std::vector<int>(x, x + sizeof x/sizeof x[0])); 

जहां sizeof x/sizeof x[0] जाहिर 3 है इस सन्दर्भ में; यह सरणी में तत्वों की संख्या प्राप्त करने का सामान्य तरीका है। ध्यान दें कि x + sizeof x/sizeof x[0] अंक एक तत्व से अंतिम तत्व है।

+1

क्या आप इसे समझा सकते हैं? मैंने पहले ही पढ़ा है कि 'वेक्टर ए (5,10); 'मतलब' 5 'int' के लिए कमरा बनाओ और उन्हें 10 के साथ प्रारंभ करें। लेकिन आपका एक्स, एक्स + ... कैसे काम करता है? क्या तुम समझा सकते हो? – UnKnown

11

प्वाइंटर किसी अन्य iterators की तरह इस्तेमाल किया जा सकता है:

int x[3] = {1, 2, 3}; 
std::vector<int> v(x, x + 3); 
test(v) 
+2

वास्तविक जीवन में आप सरणी आकार को इंगित करना चाहते हैं, उदाहरण के लिए सरणी आकार को इंगित करने के लिए 'const size_t X_SIZE = 3;' का उपयोग करके, या इसे आकार से गणना करना। मैंने पठनीयता के लिए उस हिस्से को छोड़ दिया। –

77

व्यक्तिगत रूप से, मैं काफी सी ++ 2011 दृष्टिकोण की तरह है क्योंकि यह न तो आप और न ही sizeof() सरणी सीमा का समायोजन याद करने के लिए अगर आप कभी भी परिवर्तन का उपयोग करने की आवश्यकता है सरणी सीमा (और आप सी ++ 2003 अगर आप चाहते हैं में प्रासंगिक समारोह, भी परिभाषित कर सकते हैं):

#include <iterator> 
#include <vector> 
int x[] = { 1, 2, 3, 4, 5 }; 
std::vector<int> v(std::begin(x), std::end(x)); 

जाहिर है, सी ++ 2011 से तुम वैसे भी प्रारंभकर्ता सूचियों का उपयोग करना चाह सकते हैं:

std::vector<int> v({ 1, 2, 3, 4, 5 }); 
+1

क्या यह सरणी की प्रतिलिपि बनाता है या यह सिर्फ इसे इंगित करता है? मैं प्रदर्शन –

+1

'std :: वेक्टर के साथ चिंतित हूं 'हमेशा' टी' ऑब्जेक्ट्स का मालिक है। इसमें दो प्रभाव हैं: जब वेक्टर में ऑब्जेक्ट डालने की प्रतिलिपि बनाई जाती है और उन्हें स्मृति में ध्वस्त कर दिया जाता है। उचित रूप से छोटी वस्तुओं के लिए, उदा। लघु तारों के अनुक्रम, कोलाकेशन एक प्रमुख प्रदर्शन लाभ है। यदि आपकी ऑब्जेक्ट कॉपी करने के लिए बड़ी और महंगे हैं, तो आप ऑब्जेक्ट्स को [किसी भी तरह संसाधन प्रबंधित] पॉइंटर्स स्टोर करना चाहेंगे। कौन सा दृष्टिकोण अधिक कुशल है वस्तुओं पर निर्भर करता है लेकिन आपके पास विकल्प है। –

+0

इसलिए यदि मैं एक सी ++ और सी पुस्तकालयों को इंटरफ़ेस करना चाहता हूं और सी-सरणी से वेक्टर और बैक में प्रतिलिपि बनाना चाहता हूं, तो 2 प्रतियों के दंड का भुगतान करने का कोई तरीका नहीं है?(मैं ईजिन लाइब्रेरी और जीएसएल का उपयोग कर रहा हूं) –

4

आप यहां गलत प्रश्न पूछ रहे हैं - एक वेक्टर में सबकुछ मजबूर करने के बजाय पूछें कि आप परीक्षण को एक विशिष्ट कंटेनर के बजाय इटरेटर के साथ कैसे परिवर्तित कर सकते हैं। आपको संगतता बनाए रखने के लिए भी एक अधिभार प्रदान कर सकते हैं (और मुक्त करने के लिए एक ही समय में अन्य कंटेनरों संभाल):

void test(const std::vector<int>& in) { 
    // Iterate over vector and do whatever 
} 

हो जाता है:

template <typename Iterator> 
void test(Iterator begin, const Iterator end) { 
    // Iterate over range and do whatever 
} 

template <typename Container> 
void test(const Container& in) { 
    test(std::begin(in), std::end(in)); 
} 

की सुविधा देता है जो तुम करना:

int x[3]={1, 2, 3}; 
test(x); // Now correct 

(Ideone demo)

+0

"एक वेक्टर में सबकुछ मजबूर करने के बजाय पूछें कि आप परीक्षण को एक विशिष्ट कंटेनर के बजाय इटरेटर के साथ कैसे परिवर्तित कर सकते हैं।" यह बेहतर क्यों है? – aquirdturtle

+0

@Aquirdturtle क्योंकि अब केवल वेक्टरों का समर्थन करने के बजाय आप सूचियों और सरणी का समर्थन करते हैं और कंटेनरों को बढ़ावा देते हैं और इटरेटर और श्रेणियों को बदलते हैं .... – Flexo

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

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