侯捷stl源码剖析注释47 sgistlvector.docx
- 文档编号:1178504
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:22
- 大小:20.69KB
侯捷stl源码剖析注释47 sgistlvector.docx
《侯捷stl源码剖析注释47 sgistlvector.docx》由会员分享,可在线阅读,更多相关《侯捷stl源码剖析注释47 sgistlvector.docx(22页珍藏版)》请在冰点文库上搜索。
侯捷stl源码剖析注释47sgistlvector
G++2.91.57,cygnus\cygwin-b20\include\g++\stl_vector.h完整列表
/*
*
*Copyright(c)1994
*Hewlett-PackardCompany
*
*Permissiontouse,copy,modify,distributeandsellthissoftware
*anditsdocumentationforanypurposeisherebygrantedwithoutfee,
*providedthattheabovecopyrightnoticeappearinallcopiesand
*thatboththatcopyrightnoticeandthispermissionnoticeappear
*insupportingdocumentation.Hewlett-PackardCompanymakesno
*representationsaboutthesuitabilityofthissoftwareforany
*purpose.Itisprovided"asis"withoutexpressorimpliedwarranty.
*
*
*Copyright(c)1996
*SiliconGraphicsComputerSystems,Inc.
*
*Permissiontouse,copy,modify,distributeandsellthissoftware
*anditsdocumentationforanypurposeisherebygrantedwithoutfee,
*providedthattheabovecopyrightnoticeappearinallcopiesand
*thatboththatcopyrightnoticeandthispermissionnoticeappear
*insupportingdocumentation.SiliconGraphicsmakesno
*representationsaboutthesuitabilityofthissoftwareforany
*purpose.Itisprovided"asis"withoutexpressorimpliedwarranty.
*/
/*NOTE:
Thisisaninternalheaderfile,includedbyotherSTLheaders.
*Youshouldnotattempttouseitdirectly.
*/
#ifndef__SGI_STL_INTERNAL_VECTOR_H
#define__SGI_STL_INTERNAL_VECTOR_H
__STL_BEGIN_NAMESPACE
#ifdefined(__sgi)&&!
defined(__GNUC__)&&(_MIPS_SIM!
=_MIPS_SIM_ABI32)
#pragmasetwoff1174
#endif
template
classvector{
public:
//以下標示
(1),
(2),(3),(4),(5),代表iterator_traits所服務的5個型別。
typedefTvalue_type;//
(1)
typedefvalue_type*pointer;//
(2)
typedefconstvalue_type*const_pointer;
typedefconstvalue_type*const_iterator;
typedefvalue_type&reference;//(3)
typedefconstvalue_type&const_reference;
typedefsize_tsize_type;
typedefptrdiff_tdifference_type;//(4)
//以下,由於vector所維護的是一個連續線性空間,所以不論其元素型別為何,
//原生指標都可以做為其迭代器而滿足所有需求。
typedefvalue_type*iterator;
/*根據上述寫法,如果客端寫出這樣的碼:
vector
:
iteratoris;
is的型別其實就是Shape*
而STL內部運用iterator_traits
:
reference時,獲得Shape&
運用iterator_traits
:
iterator_category時,獲得
random_access_iterator_tag(5)
(此乃iterator_traits針對原生指標的特化結果)
*/
#ifdef__STL_CLASS_PARTIAL_SPECIALIZATION
typedefreverse_iterator
typedefreverse_iterator
#else/*__STL_CLASS_PARTIAL_SPECIALIZATION*/
typedefreverse_iterator difference_type>const_reverse_iterator; typedefreverse_iterator reverse_iterator; #endif/*__STL_CLASS_PARTIAL_SPECIALIZATION*/ protected: //專屬之空間配置器,每次配置一個元素大小 typedefsimple_alloc //vector採用簡單的線性連續空間。 以兩個迭代器start和end分別指向頭尾, //並以迭代器end_of_storage指向容量尾端。 容量可能比(尾-頭)還大, //多餘即備用空間。 iteratorstart; iteratorfinish; iteratorend_of_storage; voidinsert_aux(iteratorposition,constT&x); voiddeallocate(){ if(start) data_allocator: : deallocate(start,end_of_storage-start); } voidfill_initialize(size_typen,constT&value){ start=allocate_and_fill(n,value);//配置空間並設初值 finish=start+n;//調整水位 end_of_storage=finish;//調整水位 } public: iteratorbegin(){returnstart;} const_iteratorbegin()const{returnstart;} iteratorend(){returnfinish;} const_iteratorend()const{returnfinish;} reverse_iteratorrbegin(){returnreverse_iterator(end());} const_reverse_iteratorrbegin()const{ returnconst_reverse_iterator(end()); } reverse_iteratorrend(){returnreverse_iterator(begin());} const_reverse_iteratorrend()const{ returnconst_reverse_iterator(begin()); } size_typesize()const{returnsize_type(end()-begin());} size_typemax_size()const{returnsize_type(-1)/sizeof(T);} size_typecapacity()const{returnsize_type(end_of_storage-begin());} boolempty()const{returnbegin()==end();} referenceoperator[](size_typen){return*(begin()+n);} const_referenceoperator[](size_typen)const{return*(begin()+n);} vector(): start(0),finish(0),end_of_storage(0){} //以下建構式,允許指定大小n和初值value vector(size_typen,constT&value){fill_initialize(n,value);} vector(intn,constT&value){fill_initialize(n,value);} vector(longn,constT&value){fill_initialize(n,value);} explicitvector(size_typen){fill_initialize(n,T());} vector(constvector start=allocate_and_copy(x.end()-x.begin(),x.begin(),x.end()); finish=start+(x.end()-x.begin()); end_of_storage=finish; } #ifdef__STL_MEMBER_TEMPLATES template vector(InputIteratorfirst,InputIteratorlast): start(0),finish(0),end_of_storage(0) { range_initialize(first,last,iterator_category(first)); } #else/*__STL_MEMBER_TEMPLATES*/ vector(const_iteratorfirst,const_iteratorlast){ size_typen=0; distance(first,last,n); start=allocate_and_copy(n,first,last); finish=start+n; end_of_storage=finish; } #endif/*__STL_MEMBER_TEMPLATES*/ ~vector(){ destroy(start,finish);//全域函式,建構/解構基本工具。 deallocate();//先前定義好的成員函式 } vector voidreserve(size_typen){ if(capacity() constsize_typeold_size=size(); iteratortmp=allocate_and_copy(n,start,finish); destroy(start,finish); deallocate(); start=tmp; finish=tmp+old_size; end_of_storage=start+n; } } //取出第一個元素內容 referencefront(){return*begin();} const_referencefront()const{return*begin();} //取出最後一個元素內容 referenceback(){return*(end()-1);} const_referenceback()const{return*(end()-1);} //增加一個元素,做為最後元素 voidpush_back(constT&x){ if(finish! =end_of_storage){//還有備用空間 construct(finish,x);//直接在備用空間中建構元素。 ++finish;//調整水位高度 } else//已無備用空間 insert_aux(end(),x); } voidswap(vector __STD: : swap(start,x.start); __STD: : swap(finish,x.finish); __STD: : swap(end_of_storage,x.end_of_storage); } iteratorinsert(iteratorposition,constT&x){ size_typen=position-begin(); if(finish! =end_of_storage&&position==end()){ construct(finish,x);//全域函式,建構/解構基本工具。 ++finish; } else insert_aux(position,x); returnbegin()+n; } iteratorinsert(iteratorposition){returninsert(position,T());} #ifdef__STL_MEMBER_TEMPLATES template voidinsert(iteratorposition,InputIteratorfirst,InputIteratorlast){ range_insert(position,first,last,iterator_category(first)); } #else/*__STL_MEMBER_TEMPLATES*/ voidinsert(iteratorposition, const_iteratorfirst,const_iteratorlast); #endif/*__STL_MEMBER_TEMPLATES*/ voidinsert(iteratorpos,size_typen,constT&x); voidinsert(iteratorpos,intn,constT&x){ insert(pos,(size_type)n,x); } voidinsert(iteratorpos,longn,constT&x){ insert(pos,(size_type)n,x); } voidpop_back(){ --finish; destroy(finish);//全域函式,建構/解構基本工具。 } //將迭代器position所指之元素移除 iteratorerase(iteratorposition){ if(position+1! =end())//如果p不是指向最後一個元素 //將p之後的元素一一向前遞移 copy(position+1,finish,position); --finish;//調整水位 destroy(finish);//全域函式,建構/解構基本工具。 returnposition; } iteratorerase(iteratorfirst,iteratorlast){ iteratori=copy(last,finish,first); destroy(i,finish);//全域函式,建構/解構基本工具。 finish=finish-(last-first); returnfirst; } voidresize(size_typenew_size,constT&x){ if(new_size erase(begin()+new_size,end()); else insert(end(),new_size-size(),x); } voidresize(size_typenew_size){resize(new_size,T());} //清除全部元素。 注意,並未釋放空間,以備可能未來還會新加入元素。 voidclear(){erase(begin(),end());} protected: iteratorallocate_and_fill(size_typen,constT&x){ iteratorresult=data_allocator: : allocate(n);//配置n個元素空間 __STL_TRY{ //全域函式,記憶體低階工具,將result所指之未初始化空間設定初值為x,n個 //定義於 uninitialized_fill_n(result,n,x); returnresult; } //"commitorrollback"語意: 若非全部成功,就一個不留。 __STL_UNWIND(data_allocator: : deallocate(result,n)); } #ifdef__STL_MEMBER_TEMPLATES template iteratorallocate_and_copy(size_typen, ForwardIteratorfirst,ForwardIteratorlast){ iteratorresult=data_allocator: : allocate(n); __STL_TRY{ uninitialized_copy(first,last,result); returnresult; } __STL_UNWIND(data_allocator: : deallocate(result,n)); } #else/*__STL_MEMBER_TEMPLATES*/ iteratorallocate_and_copy(size_typen, const_iteratorfirst,const_iteratorlast){ iteratorresult=data_allocator: : allocate(n); __STL_TRY{ uninitialized_copy(first,last,result); returnresult; } __STL_UNWIND(data_allocator: : deallocate(result,n)); } #endif/*__STL_MEMBER_TEMPLATES*/ #ifdef__STL_MEMBER_TEMPLATES template voidrange_initialize(InputIteratorfirst,InputIteratorlast, input_iterator_tag){ for(;first! =last;++first) push_back(*first); } //Thisfunctionisonlycalledbytheconstructor.Wehavetoworry //aboutresourceleaks,butnotaboutmaintaininginvariants. template voidrange_initialize(ForwardIteratorfirst,ForwardIteratorlast, forward_iterator_tag){ size_typen=0; distance(first,last,n); start=allocate_and_copy(n,first,last); finish=start+n; end_of_storage=finish; } template voidrange_insert(iteratorpos, InputIteratorfirst,InputIteratorlast, input_iterator_tag); template voidrange_insert(iteratorpos, ForwardIteratorfirst,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 侯捷stl源码剖析注释47 sgistlvector 侯捷 stl 源码 剖析 注释 47