2010-11-24 22 views
50

स्ट्रिंग्स की वेक्टर सरणी प्रारंभ करना संभव होगा।तारों की एक वेक्टर सरणी शुरू करें

उदाहरण के लिए

:

static std::vector<std::string> v; // एक वर्ग के सदस्य

मैं static इस्तेमाल किया सिर्फ प्रारंभ और तार के साथ इसे भरने के लिए के रूप में घोषित कर दिया। या मुझे इसे केवल कन्स्ट्रक्टर में भरना चाहिए यदि इसे प्रारंभिक नहीं किया जा सकता है जैसे कि हम नियमित सरणी करते हैं।

+0

से क्या के साथ प्रारंभ, वास्तव में? निश्चित रूप से इसे शुरू करने के कई तरीके हैं। –

+0

'स्थिर '" तारों से भरें "नहीं है। Std :: वेक्टर एक गतिशील डेटा संरचना है और इसे खाली बनाया गया है। – Blastfurnace

+0

इस संदर्भ में 'स्थैतिक' का अर्थ है कि आपकी कक्षा के कई उदाहरण सभी समान 'v' साझा करते हैं, क्या आप वास्तव में क्या चाहते हैं? C12+ 0x में आसान तरीका का उल्लेख करने के लिए – birryree

उत्तर

55

क्रमबद्ध की:

class some_class { 
    static std::vector<std::string> v; // declaration 
}; 

const char *vinit[] = {"one", "two", "three"}; 

std::vector<std::string> some_class::v(vinit, end(vinit)); // definition 

end सिर्फ इसलिए मैं करने के लिए नहीं है vinit+3 लिखें और बाद में लंबाई बदलते समय इसे अद्यतित रखें। के रूप में यह निर्धारित करें:

template<typename T, size_t N> 
T * end(T (&ra)[N]) { 
    return ra + N; 
} 
+2

और अरे, मैंने 'एंड' करने के लिए एक चालाक टेम्पलेट शामिल नहीं किया :) :) –

+0

क्या मैं अभी उपयोग कर सकता हूं int numElements = sizeof (vinit)/4; – cpx

+0

@ सीपीएक्स: यदि 'sizeof (char *)' 4 है, हाँ। 64 बिट मशीन पर इतना ज्यादा नहीं। हर बार जब मैं एक सरणी को पुन: उत्पन्न करता हूं तो मैं बस 'sizeof' सामान का एक गुच्छा टाइप करने से ऊब गया। मेरा 'एंड' फ़ंक्शन सी ++ 0x में 'std :: end' के रूप में सरणी के लिए समान प्रभाव डालता है। –

14
const char* args[] = {"01", "02", "03", "04"}; 
std::vector<std::string> v(args, args + 4); 

और C++ 0x में, आप std::initializer_list<> का लाभ ले सकते:

http://en.wikipedia.org/wiki/C%2B%2B0x#Initializer_lists

+1

+1, बहुत खराब MSVC 2010 इस व्यवहार का समर्थन नहीं करता है :( – rubenvb

5

@ मू-रस के रूप में ही:

const char* args[] = {"01", "02", "03", "04"}; 
std::vector<std::string> v(args, args + sizeof(args)/sizeof(args[0])); //get array size 
+1

यह मानता है कि सभी तर्क [] init सूची में एक ही आकार के हैं? – jwillis0720

+1

@ jwillis0720: सभी तर्क [एन] वास्तव में एक ही आकार के होते हैं, आकार (char *) सटीक होने के लिए। इसका कारण यह है कि तर्क "चीज" को एक सूचक (char *) को स्टोर करता है, न कि "चीज़"। –

9

MSVC 2010 समाधान, क्योंकि यह std::initializer_list<> वैक्टर के लिए समर्थन नहीं करता है लेकिन यह std::end

01 का समर्थन करता है
const char *args[] = {"hello", "world!"}; 
std::vector<std::string> v(args, std::end(args)); 
22

आप cpp11 उपयोग कर रहे हैं (-std=c++0x झंडा अगर जरूरत के साथ सक्षम), तो आप बस इस तरह वेक्टर प्रारंभ कर सकते हैं:

// static std::vector<std::string> v; 
v = {"haha", "hehe"}; 
2

यह 2017 है, लेकिन इस सूत्र अपने खोज इंजन में शीर्ष है आज निम्न विधियों में पसंद किया जाता है (प्रारंभकर्ता सूचियों)

std::vector<std::string> v = { "xyzzy", "plugh", "abracadabra" }; 
std::vector<std::string> v({ "xyzzy", "plugh", "abracadabra" }); 
std::vector<std::string> v{ "xyzzy", "plugh", "abracadabra" }; 

https://en.wikipedia.org/wiki/C%2B%2B11#Initializer_lists

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