2012-02-23 14 views
6

सी ++ 11 में, std :: वेक्टर में निर्माता vector(size_type n) है जो डिफ़ॉल्ट रूप से n आइटमों का निर्माण करेगा, जिसका उपयोग डिफ़ॉल्ट रचनात्मक, जंगम, गैर-प्रतिलिपि योग्य वर्गों के साथ किया जा सकता है।सी ++ 11 में कोई वेक्टर (आकार_ प्रकार एन, कॉन्स आवंटक और आवंटन) क्यों नहीं है?

हालांकि, हर दूसरे वेक्टर निर्माता के विपरीत, वहाँ कोई संस्करण है कि एक संभाजक लेता है, और मैं निम्नलिखित का सहारा लिया:

// Foo is default constructible and moveable, but not copyable 
const int n = 10; // Want 10 default constructed Foos 
std::vector<Foo, CustomAllocator> foos(allocator); 
foos.reserve(n); 
for (int i = 0; i < n; ++i) 
    foos.emplace_back(); 

वहाँ एक बेहतर तरीका यह पूरा करने के है? क्या vector(size_type n, const Allocator& alloc) मानक से छोड़ा गया कोई विशिष्ट कारण है? size_type n निर्माता के तीन तर्क संस्करण का उपयोग करने

const int n = 10; 
std::vector<Foo, Alloc> foos(allocator); 
foo.resize(n); 

एक अन्य विकल्प है::

+0

विनिर्देश में एक दोष की तरह लगता है। उस पर एक रिपोर्ट दर्ज करें, अगर कोई पहले से नहीं है। –

+0

@ निकोलबोलस ऐसे दस्तावेज हैं जो रिपोर्ट दर्ज करने की प्रक्रिया का वर्णन करते हैं? – rkjnsn

+0

कोई बात नहीं। मेरी पोस्ट देखें –

उत्तर

7

इसके बारे में सोचने के बाद, यह सब के बाद एक दोष नहीं हो सकता है।

यह संभव है कि allocator_type और value_type विपरीत समान प्रकार हैं। उस स्थिति में, कौन सा फ़ंक्शन vector(3, alloc) कॉल करेगा? कन्स्ट्रक्टर जो सभी तत्वों में प्रतिलिपि बनाने के लिए डिफ़ॉल्ट मान लेता है, या जो आकार और आवंटक लेता है? यह संदिग्ध है, और इस प्रकार एक संकलन त्रुटि है।

+0

यिक्स! मुझे नहीं लगता कि मैंने कभी सोचा होगा। – rkjnsn

+1

आसानी से ['std :: allocator_arg'] (http://en.cppreference.com/w/cpp/memory/allocator_arg) के साथ हल करने योग्य है, जो पहले से ही अन्य स्थानों (जैसे 'std :: tuple') में उपयोग किया जाता है। आवंटक संस्करण तब वेक्टर (3, std :: allocator_arg, alloc) होगा। – Xeo

+3

मानक पुस्तकालय को अक्सर टेम्पलेट पैरामीटर के साथ कार्यों के अधिभार में पैरामीटर की एक ही संख्या का उपयोग करने से बचना होता है। उदाहरण के लिए यही कारण है कि उन्होंने आखिरकार एक वैरैडिक std :: max परिचय नहीं दिया और इसके बजाय एक संस्करण के साथ चला गया जो प्रारंभकर्ता सूची लेता है। कस्टम तुलना के लिए अनुमति देने के दौरान एक आसान उपयोग फैशन में लागू करने के लिए एक विविध संस्करण असंभव होगा। – bames53

6

पहले, अपने reserve/पाश thingy के बजाय, आप बस resize प्राप्त करने के लिए अपने कल्पना निर्माता क्या करेंगे उपयोग कर सकते हैं

const int n = 10; 
std::vector<Foo, Alloc> foos(n, Foo(), allocator); 

हालांकि यह वास्तव में निर्माणों तत्व है, जो या स्वीकार्य नहीं हो सकता में कॉपी।

तर्क पर? कोई जानकारी नहीं। शायद अनदेखा किया।

+0

धन्यवाद। मुझे पता था कि मुझे एक आसान तरीका दिखाना चाहिए। – rkjnsn

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