好記性不如爛博客;stl源碼剖析那本書不想看,沒事(有事懶得做)看看微軟的vector實現(xiàn)。
專注于為中小企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)兗州免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了超過千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
以vector<int> 為例
template <class _Ty, class _Alloc = allocator<_Ty>> class vector { // varying size array of values private: template<class> friendclass _Vb_val;//???? friend _Tidy_guard<vector>; using _Alty = _Rebind_alloc_t<_Alloc, _Ty>;//會區(qū)分是不是默認(rèn)分配器_Default_allocator_traits或自定義allocator,是默認(rèn)的話,就是本身allocator<int>,否則。。。模板嵌套太多了。。 using _Alty_traits = allocator_traits<_Alty>; public: static_assert(!_ENFORCE_MATCHING_ALLOCATORS || is_same_v<_Ty, typename _Alloc::value_type>, _MISMATCHED_ALLOCATOR_MESSAGE("vector<T, Allocator>", "T")); using value_type = _Ty;//int using allocator_type = _Alloc;// using pointer = typename _Alty_traits::pointer; using const_pointer = typename _Alty_traits::const_pointer; using reference = _Ty&; using const_reference = const _Ty&; using size_type = typename _Alty_traits::size_type; using difference_type = typename _Alty_traits::difference_type; private:
//template <class _Alloc> // tests if allocator has simple addressing
//_INLINE_VAR constexpr bool _Is_simple_alloc_v = is_same_v<typename allocator_traits<_Alloc>::size_type, size_t>&&
//is_same_v<typename allocator_traits<_Alloc>::difference_type, ptrdiff_t>&&
//is_same_v<typename allocator_traits<_Alloc>::pointer, typename _Alloc::value_type*>&&
//is_same_v<typename allocator_traits<_Alloc>::const_pointer, const typename _Alloc::value_type*>;
using _Scary_val = _Vector_val<conditional_t<_Is_simple_alloc_v<_Alty>, _Simple_types<_Ty>, _Vec_iter_types<_Ty, size_type, difference_type, pointer, const_pointer, _Ty&, const _Ty&>>>;//是否是simple類型,選擇不同的types,
只要不是自定義類型,應(yīng)該都是選擇第一個,其實第二個無非也是用自定義的類型。 public: using iterator = _Vector_iterator<_Scary_val>; using const_iterator = _Vector_const_iterator<_Scary_val>; using reverse_iterator = _STD reverse_iterator<iterator>; using const_reverse_iterator = _STD reverse_iterator<const_iterator>;
//兩個構(gòu)造函數(shù)同理,區(qū)分自定義分配器類型 #define _GET_PROXY_ALLOCATOR(_Alty, _Al) static_cast<_Rebind_alloc_t<_Alty, _Container_proxy>>(_Al) 這種寫法第一次見,參數(shù)沒有實際作用,構(gòu)造一個新對象 _CONSTEXPR20_CONTAINER vector() noexcept(is_nothrow_default_constructible_v<_Alty>) : _Mypair(_Zero_then_variadic_args_t{}) { _Mypair._Myval2._Alloc_proxy(_GET_PROXY_ALLOCATOR(_Alty, _Getal()));//_GET_PROXY_ALLOCATOR(_Alty, _Getal()),構(gòu)造一個allocator<_Container_proxy>
}
_CONSTEXPR20_CONTAINERexplicit vector(const _Alloc& _Al) noexcept : _Mypair(_One_then_variadic_args_t{}, _Al) { _Mypair._Myval2._Alloc_proxy(_GET_PROXY_ALLOCATOR(_Alty, _Getal())); }
_Compressed_pair<_Alty, _Scary_val> _Mypair;//僅有的成員變量,實際繼承第一個模板參數(shù),負(fù)責(zé)分配數(shù)據(jù)內(nèi)存,并持有一個_Scary_val的變量,負(fù)責(zé)管理數(shù)據(jù)
......
......
}
分享標(biāo)題:MSVC2019的vector標(biāo)準(zhǔn)庫實現(xiàn)源碼分析
標(biāo)題路徑:http://chinadenli.net/article40/dsogoeo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、網(wǎng)站改版、App開發(fā)、網(wǎng)站營銷、云服務(wù)器、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)