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


94

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

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

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

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

जवाबों:


140

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

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
क्या आप कृपया इसे समझा सकते हैं? मैंने पहले ही पढ़ा कि vector<int> a(5,10);इसका मतलब make room for 5 int` है और उन्हें 10 के साथ प्रारंभ करें। लेकिन आपका x, x + ... कैसे काम करता है? क्या तुम समझा सकते हो?
आसिफ मुश्ताक

1
@UnKnown का चयन करने के बजाय vector<int>::vector(size_type, int), यह चयन करता है vector<int>::vector(int*, int*), जो उस बिंदु के संकेत द्वारा निरूपित सीमा को कॉपी करता है। पहला ओवरलोड (2) है, दूसरा यहां ओवरलोड (4) है
Caleth

1
C ++ 11 std :: की सीमा आकार की विधि से बेहतर है। sizeof x / sizeof x[0] == std::extent<decltype(x)>::value
इसहाक पास्कल

115

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

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

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

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

2
क्या यह सरणी की प्रतिलिपि बनाता है या यह केवल इसे इंगित करता है? मैं प्रदर्शन से संबंधित हूं
kirill_igum

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

इसलिए अगर मैं c ++ और ac लाइब्रेरीज़ को इंटरफ़ेस करना चाहता हूँ और c-array से वेक्टर और बैक में कॉपी करता हूँ, तो 2 प्रतियों का जुर्माना भरने का कोई तरीका नहीं है? (मैं eigen पुस्तकालय और gsl का उपयोग कर रहा हूँ)
kirill_igum

16

पॉइंटर्स का उपयोग किसी अन्य पुनरावृत्तियों की तरह किया जा सकता है:

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

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

11

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

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 डेमो )


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

1
क्योंकि अब, केवल समर्थन वैक्टर के बजाय @aquirdturtle आप सूचियों और सरणियों और बढ़ावा कंटेनरों का समर्थन और बदलने iterators और सीमाओं तथा ....
Flexo

2
और आपको डेटा को कॉपी करने की आवश्यकता नहीं थी
ऑर्बिट से

2

एक सरल तरीका assign()फ़ंक्शन का उपयोग हो सकता है जो vectorकक्षा में पूर्व-परिभाषित है ।

जैसे

array[5]={1,2,3,4,5};

vector<int> v;
v.assign(array, array+5); // 5 is size of array.

2
Ctor के उपयोग के समतुल्य, जिसका उल्लेख मौजूदा उत्तरों में लगभग सात साल पहले किया गया था। जोड़ता कुछ भी नहीं ...
लाइटनेस दौड़ ऑर्बिट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.