2016-12-28 14 views
5

unique_ptr एस की एक सरणी भरने के लिए std:fill का उपयोग करना संभव है? इरादा अलग-अलग ऑब्जेक्ट्स को अलग-अलग पॉइंटर्स रखना है जो समान पैरामीटर के साथ प्रारंभ किए जाते हैं।unique_ptr की सरणी कैसे भरें?

उदाहरण के लिए:

std::unique_ptr<int> ar[3]; 
std::fill(ar.begin(), ar.end(), make_unique_for_each_element_somehow<int>(1)); 
+0

'है std :: एक साथ array' 'std :: startizer_list' एक विकल्प? –

+0

'std :: array' एक विकल्प है लेकिन इरादा एक ही भरने वाले तत्व को दोहराना नहीं है 'एन' टाइम्स – Danra

+0

इसलिए मैंने' std :: startizer_list' (या बस '{}' प्रारंभिकरण) का प्रस्ताव दिया है। –

उत्तर

19

नहीं है, लेकिन यह क्या std::generate के लिए है।

लक्ष्य मूल्य में प्रतिलिपि बनाई गई एक एकल मान देने के बजाय, std::generate को "जनरेटर" फ़ंक्शन दिया जाता है जो प्रत्येक मान को आवश्यकतानुसार बनाता है।

तो, शायद, कुछ इस तरह:

std::unique_ptr<int> ar[3]; 
std::generate(
    std::begin(ar), 
    std::end(ar), 
    []() { return std::make_unique<int>(1); } 
); 

मैं इसे करने की कोशिश नहीं की है, और नहीं जानता कि क्या आप सब पर क्रम गैर copyability से उत्पन्न समस्याओं से बचने के लिए इसके साथ बेला की जरूरत है । उम्मीद है कि semantics ले जाएँ पर्याप्त हैं।

(बेशक, सी ++ 11 में, आप your own make_unique function की आवश्यकता होगी।)

वैसे, अपने .begin() और .end() गलत थे (सरणियों सदस्य कार्यों की जरूरत नहीं है), तो (एक चेतावनी के लिए धन्यवाद songyuanyao से) मैंने उनको सही किया है।

+0

@songyuanyao: हाँ :) –

+0

'std :: make_unique' सी ++ 11 में वापस नहीं आया :) – Quentin

+0

@ क्वांटिन: ओपी ने प्रश्न सी ++ 14 टैग किया है। यदि आवश्यक हो तो वह या वह हमेशा होमब्री 'make_unique' पर वापस आ सकती है :) –

8

मुझे नहीं लगता कि आप std::fill() साथ यह कर सकते हैं, लेकिन यह std::generate() के साथ क्या करना मामूली बात है:

std::unique_ptr<int> array[10]; 
std::generate(std::begin(array), std::end(array), 
       []{ return std::unique_ptr<int>(new int(17)); }); 
0

एक अन्य समाधान:

std::unique_ptr<int> ar[3]; 

size_t i; 
for (i = 0; i < elementsof(ar); ++i) { 
    ar[i].reset(new int); 
} 
संबंधित मुद्दे