2010-03-13 11 views
7

यह सरल लग रहा है, लेकिन मैं उलझन में हूँ में प्रयोग किया जाता है: जिस तरह से मैं, सौ का एक वेक्टर बनाने कहते हैं, int रोंकौन सा std :: वेक्टर के निर्माता इस मामले

std::vector<int> *pVect = new std::vector<int>(100); 

है हालांकि, एसटीडी पर देख रहे हैं: : वेक्टर के documentation मुझे लगता है कि इसके निर्माता प्रपत्र

explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator()); 

तो की है, कि पिछले एक काम करता है? क्या new डिज़ाइनर को डिफॉल्ट कन्स्ट्रक्टर से प्राप्त प्रारंभिक मान के साथ कॉल करता है? अगर ऐसा है,

std::vector<int, my_allocator> *pVect = new std::vector<int>(100, my_allocator); 

जहां मैं अपने खुद के संभाजक गुजरती हैं, भी काम करेगा?

+0

इसके अलावा, यह अगर आप एक ऑनलाइन संसाधन है कि 'new' और ctors के इन पहलुओं को शामिल किया गया कर सकते हैं सुझाव बहुत अच्छा होगा। धन्यवाद। – recipriversexclusion

+0

क्षमा करें, मुझे नहीं पता कि आपके प्रश्न के साथ 'नया' क्या करना है। – AraK

+0

असल में, मैं क्या सोच रहा हूं: क्या 'नया' सिर्फ ctor को कॉल नहीं करता है? लेकिन इस मामले में, उस रूप में कोई सीटीओ नहीं है। – recipriversexclusion

उत्तर

14

आप इसे सब गलत कर रहे हैं। बस एक स्वत: वस्तु के रूप में इसे बनाने के अगर आप सभी की जरूरत वर्तमान क्षेत्र में एक वेक्टर और समय

std::vector<int> pVect(100); 

निर्माता दूसरे और तीसरे पैरामीटर के लिए डिफ़ॉल्ट तर्क है। तो यह सिर्फ एक int के साथ कॉल करने योग्य है। आप एक खुद संभाजक पास करना चाहते हैं, तो आप के बाद से आप सिर्फ छोड़ नहीं कर सकता यह

std::vector<int, myalloc> pVect(100, 0, myalloc(some_params)); 

एक समर्पित उदाहरण बात

void f(int age, int height = 180, int weight = 85); 

int main() { 
    f(25); // age = 25, height and weight taken from defaults. 
    f(25, 90); // age=25, height = 90 (oops!). Won't pass a weight! 
    f(25, 180, 90); // the desired call. 
} 
+0

मेरा प्रश्न बिल्कुल: आप पहले मामले में दूसरा तर्क क्यों छोड़ सकते हैं और दूसरा नहीं ? सीटीओ दूसरे मूल्य को क्यों नहीं रखता है जैसा कि पहले मामले में किया गया था? – recipriversexclusion

+0

@recipriversexclusion: दूसरे और तीसरे पैरामीटर में डिफ़ॉल्ट तर्क हैं ताकि आप कन्स्ट्रक्टर को एक, दो, _or_ तीन तर्कों के साथ कॉल कर सकें। यदि आप तीसरे पैरामीटर के लिए तर्क पारित करना चाहते हैं, तो आपको दूसरे पैरामीटर के लिए एक तर्क भी पारित करने की आवश्यकता है (संकलक को और जानें कि आपका मतलब क्या है "दूसरा पैरामीटर छोड़ें और यह मान तीसरे को दें?")। –

+0

@recip क्योंकि यह अपने आप पर मनमाने ढंग से निर्णय नहीं लेगा। तर्क उनके नियमों के बराबर नहीं, तर्क और मानकों की स्थिति को समतुल्य करके काम करता है। कल्पना करें कि आप 'फ्लोट' का वेक्टर बनाते हैं, और यह कि आपका आवंटक एक int (रूपांतरण) द्वारा बनाया जा सकता है। फिर 'वेक्टर <फ्लोट, myalloc> v (10, 5) में' कंपाइलर केवल इतना नहीं कह सकता है कि "5 पैरामीटर को दूसरे पैरामीटर को पास करने के बजाय 10 तत्वों के डिफ़ॉल्ट मान के रूप में, मैं इसे पास कर दूंगा तीसरा पैरामीटर, इसे आवंटित करने के लिए परिवर्तित करना "। वह बस काम नहीं करेगा। तब आप अपनी इच्छा को स्पष्ट रूप से कैसे बता सकते हैं? –

6
करने के लिए

(शायद) स्पष्ट:

100 तत्वों के वी कहा जाता है एक सदिश वस्तु बनाने के लिए:

std::vector <int> v(100); 

इस सदिश निर्माता है कि आकार (100) पहले पैरामीटर के रूप लेता है का उपयोग करता है।

std::vector <int> * p = new std::vector<int>(100); 

जो बिल्कुल एक ही निर्माता का उपयोग करता है: 100 तत्वों की एक गतिशील आवंटित वेक्टर बनाने के लिए।

+0

धन्यवाद, मेरी मूल पोस्ट कुछ हद तक खराब हो गई थी, अब इसे ठीक किया गया। मेरा सवाल है: मुझे कैसे पता चलेगा कि टीएच कन्स्ट्रक्टर के अन्य तीसरे पैरामीटर को छोड़ दिया जा सकता है, क्योंकि वेक्टर सीटीआर में वास्तव में तीन पैरामीटर हैं? और, दूसरे और तीसरे तर्कों को छोड़ना ठीक क्यों है (डिफ़ॉल्ट का उपयोग किया जाता है) लेकिन सिर्फ दूसरा नहीं? धन्यवाद। – recipriversexclusion

+0

ये पैरामीटर "डिफ़ॉल्ट पैरामीटर निर्माण" के कारण छोड़े जा सकते हैं: कॉन्स टी एंड वैल्यू = टी(), कॉन्स ऑलोकेटर और = ऑलोकेटर() –

0

स्पष्ट हो सकता है आप एक vector पैदा कर रहे एक दूसरा तर्क पारित करने के लिए है सौ तत्वों का। आप दूसरी कोड नमूने में देख सकते हैं आप पोस्ट:

स्पष्ट वेक्टर (size_type एन, स्थिरांक टी & मूल्य = टी(), स्थिरांक संभाजक & = संभाजक());

यह निर्माता तत्वों की मात्रा vector में लाना और एक value जो वेक्टर में सम्मिलित किया जाएगा n बार लेता है। यदि आप value निर्दिष्ट नहीं करते हैं तो value आपके वेक्टर प्रकार T के डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग करके बनाया गया है। यहाँ यह int के "डिफ़ॉल्ट" निर्माता जो इसे 0 पर आरंभ होगा (वहाँ int की एक डिफ़ॉल्ट निर्माता के रूप में ऐसी कोई बात नहीं है, लेकिन सी ++ मानक का कहना है कि int ऐसे मामलों में 0 पर आरंभ नहीं हो जाता)।

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