सरणी को वेक्टर में बदलने का सबसे सरल तरीका क्या है?
void test(vector<int> _array)
{
...
}
int x[3]={1, 2, 3};
test(x); // Syntax error.
मैं x को सरलतम तरीके से int array से वेक्टर में बदलना चाहता हूं।
सरणी को वेक्टर में बदलने का सबसे सरल तरीका क्या है?
void test(vector<int> _array)
{
...
}
int x[3]={1, 2, 3};
test(x); // Syntax error.
मैं x को सरलतम तरीके से int array से वेक्टर में बदलना चाहता हूं।
जवाबों:
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]
एक तत्व को इंगित करता है ।
sizeof x / sizeof x[0] == std::extent<decltype(x)>::value
व्यक्तिगत रूप से, मुझे 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 });
std::vector<T>
हमेशा T
वस्तुओं का मालिक है । इसके दो निहितार्थ हैं: जब किसी सदिश में वस्तु सम्मिलित की जाती है तो उनकी प्रतिलिपि बनाई जाती है और उन्हें स्मृति में ढहा दिया जाता है। यथोचित रूप से छोटी वस्तुओं के लिए, उदाहरण के लिए, छोटे तारों के अनुक्रम, कोलाजेशन एक प्रमुख प्रदर्शन लाभ है। यदि आपकी वस्तुएँ कॉपी करने के लिए बड़ी और महंगी हैं, तो आप वस्तुओं में [किसी तरह संसाधन प्रबंधित] पॉइंटर्स स्टोर करना चाहते हैं। कौन सा दृष्टिकोण अधिक कुशल है यह वस्तुओं पर निर्भर करता है लेकिन आपके पास विकल्प है।
पॉइंटर्स का उपयोग किसी अन्य पुनरावृत्तियों की तरह किया जा सकता है:
int x[3] = {1, 2, 3};
std::vector<int> v(x, x + 3);
test(v)
const size_t X_SIZE = 3;
को निरूपित करना चाहते हैं, उदाहरण के लिए सरणी आकार को निरूपित करने के लिए उपयोग कर सकते हैं , या आकार-प्रकार की गणना कर सकते हैं। मैंने पठनीयता के लिए उस हिस्से को छोड़ दिया।
आप यहां गलत सवाल पूछ रहे हैं - एक वेक्टर में सब कुछ मजबूर करने के बजाय आप पूछ सकते हैं कि आप एक विशिष्ट कंटेनर के बजाय पुनरावृत्तियों के साथ काम करने के लिए परीक्षण कैसे बदल सकते हैं। संगतता बनाए रखने के लिए आप एक अधिभार भी प्रदान कर सकते हैं (और मुफ्त में उसी समय अन्य कंटेनरों को संभाल सकते हैं):
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 डेमो )
एक सरल तरीका assign()
फ़ंक्शन का उपयोग हो सकता है जो vector
कक्षा में पूर्व-परिभाषित है ।
जैसे
array[5]={1,2,3,4,5};
vector<int> v;
v.assign(array, array+5); // 5 is size of array.
vector<int> a(5,10);
इसका मतलबmake room for 5
int` है और उन्हें 10 के साथ प्रारंभ करें। लेकिन आपका x, x + ... कैसे काम करता है? क्या तुम समझा सकते हो?