मैं वेक्टर के जीसीसी कार्यान्वयन की जाँच की, इसे पढ़ता है:
vector(size_type __n, const value_type& __value,
const allocator_type& __a = allocator_type())
: _Base(__n, __a)
{ _M_fill_initialize(__n, __value); }
...
_M_fill_initialize(size_type __n, const value_type& __value)
{
this->_M_impl._M_finish =
std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value,
_M_get_Tp_allocator());
}
इसलिए, यह की तरह संभाजक की जानकारी नहीं होती लग रहा है। हालांकि uninitialized_fill_n_a
का कोड अजीब है, इसमें दो ओवरलोड हैं (नीचे देखें), जेनेरिक आवंटक के लिए एक और दूसरा std::allocator
के लिए।
जेनेरिक कॉल, construct
और std::allocator
के लिए विशेष बस std::uninitialized_fill()
पर कॉल करता है।
तो, मेरे निष्कर्ष निम्नलिखित,
1) सभी std::allocator
के construct
नई नियुक्ति और
2 के रूप में एक ही प्रभाव है) कि जेनेरिक allocators के लिए नहीं माना जा सकता, या कम से कम जीसीसी है std::vector
यह नहीं मानता है। (@Michael बर के अनुसार आप इस में सी ++ 03 मान सकते हैं, दुर्भाग्य से वह सी ++ 11 का उल्लेख नहीं है)।
इसलिए निर्माण का उपयोग करें (कि std::allocator_traits<Alloc>::construct(alloc, pointer, value)
है)।
मेरे व्यक्तिगत राय (इस जांच के बाद), कि
i) std::uninitialized_fill
दोषपूर्ण है, में है कि के रूप में संभाजक के साथ एक आखिरी वैकल्पिक तर्क (या किसी अन्य अधिभार),
ii) ले जाना चाहिए एक समाधान अपने क्रियान्वयन विस्तार के अंदर आप एक .uninitialized_fill(first, last, value, alloc)
समारोह है कि (कैसे निर्माणों विफलता पर नष्ट कर देता है साथ unrolled कर रहे हैं नीचे टिप्पणी) अपवादों में से निपटने सहित काम करता है, होना चाहिए। ।
iii) आप संभाजक बारे में जानकारी है (और मूल रूप से आप इसे reimplement करने के लिए है जब वर्तमान std::unitialized_fill
बहुत बेकार है)
अब कोड ऊपर संदर्भित:
template<typename _ForwardIterator, typename _Size, typename _Tp,
typename _Allocator>
_ForwardIterator
__uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
const _Tp& __x, _Allocator& __alloc)
{
_ForwardIterator __cur = __first;
__try
{
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
for (; __n > 0; --__n, ++__cur)
__traits::construct(__alloc, std::__addressof(*__cur), __x);
return __cur;
}
__catch(...)
{
std::_Destroy(__first, __cur, __alloc);
__throw_exception_again;
}
}
template<typename _ForwardIterator, typename _Size, typename _Tp,
typename _Tp2>
inline _ForwardIterator
__uninitialized_fill_n_a(_ForwardIterator __first, _Size __n,
const _Tp& __x, allocator<_Tp2>&)
{ return std::uninitialized_fill_n(__first, __n, __x); }
'एसटीडी क्या है :: initialize_fill() '? क्या आपका मतलब है 'std :: uninitialized_fill() '? 'Initialize_fill()' समारोह अप सी ++ मानक में कहीं भी दिखाई नहीं है, 'uninitialized_fill के विपरीत()'। –
@Insilico क्षमा करें, यह एक टाइपो था। धन्यवाद। मैंने सवाल तय किया। – Martin
यह मेरे प्रश्न से संबंधित प्रतीत होता है: http://stackoverflow.com/questions/9727556/is-uninitialized-copy-fillin-first-in-last-for-dest-aa-an-oversight-in-th, मैं करता हूं लगता है कि वास्तविकता में सामान्य 'uninitialized_fill' –