锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
錛堜竴錛塿ector瀹瑰櫒
vector鐨勬暟鎹畨鎺掍互鍙婃搷浣滄柟寮忥紝涓巃rray闈炲父鐩鎬技銆備袱鑰呯殑鍞竴鍖哄埆鍦ㄤ簬絀洪棿鐨勮繍鐢ㄧ殑鐏墊椿鎬с俛rray鏄潤鎬佺┖闂達紝涓鏃﹂厤緗簡灝變笉鑳芥敼鍙樸倂ector鏄姩鎬佺┖闂達紝闅忕潃鍏冪礌鐨勫姞鍏ワ紝瀹冪殑鍐呴儴鏈哄埗浼氳嚜琛屾墿鍏呯┖闂翠互瀹圭撼鏂板厓绱犮傚洜姝わ紝vector鐨勮繍鐢ㄥ浜庡唴瀛樼殑鍚堢悊鍒╃敤涓庤繍鐢ㄧ殑鐏墊椿鎬ф湁寰堝ぇ鐨勫府鍔╋紝鎴戜滑鍐嶄篃涓嶅繀鍥犱負瀹蟲曠┖闂翠笉瓚寵屼竴寮濮嬭姹備竴涓ぇ鍧楃殑array銆?br />
vector鍔ㄦ佸鍔犲ぇ灝忥紝騫朵笉鏄湪鍘熺┖闂翠箣鍚庢寔緇柊絀洪棿錛堝洜涓烘棤娉曚繚璇佸師絀洪棿涔嬪悗灝氭湁鍙緵閰嶇疆鐨勭┖闂達級錛岃屾槸浠ュ師澶у皬鐨勪袱鍊嶅彟澶栭厤緗竴鍧楄緝澶х殑絀洪棿錛岀劧鍚庡皢鍘熷唴瀹規(guī)嫹璐濊繃鏉ワ紝鐒跺悗鎵嶅紑濮嬪湪鍘熷唴瀹逛箣鍚庢瀯閫犳柊鍏冪礌錛屽茍閲婃斁鍘熺┖闂淬傚洜姝わ紝瀵箆ector鐨勪換浣曟搷浣滐紝涓鏃﹀紩璧風(fēng)┖闂撮噸鏂伴厤緗紝鎸囧悜鍘焩ector鐨勬墍鏈夎凱浠e櫒灝遍兘澶辨晥浜嗐?br />
錛堜簩錛塴ist瀹瑰櫒
鐩稿浜巚ector鐨勮繛緇┖闂達紝list灝辨樉寰楀鏉傝澶氾紝瀹冪殑濂藉鏄瘡嬈℃彃鍏ユ垨鍒犻櫎涓涓厓绱狅紝灝遍厤緗垨閲婃斁涓涓厓绱犵┖闂淬傚洜姝わ紝list瀵逛簬絀洪棿鐨勮繍鐢ㄦ湁緇濆鐨勭簿鍑嗭紝涓鐐逛篃涓嶆氮璐廣傝屼笖錛屽浜庝換浣曚綅緗殑鍏冪礌鎻掑叆鎴栧厓绱犵Щ闄わ紝list姘歌繙鏄父鏁版椂闂淬係TL涓殑list鏄竴涓弻鍚戦摼琛紝鑰屼笖鏄竴涓幆鐘跺弻鍚戦摼琛ㄣ?br />
錛堜笁錛塪eque瀹瑰櫒
deque 鏄竴縐嶅弻鍚戝紑鍙g殑榪炵畫綰挎х┖闂淬傛墍璋撳弻鍚戝紑鍙o紝鎰忔濇槸鍙互鍦ㄩ槦灝句袱绔垎鍒仛鍏冪礌鐨勬彃鍏ュ拰鍒犻櫎鎿嶄綔銆俤eque鍜寁ector鐨勬渶澶у樊寮傦紝涓鍦ㄤ簬deque鍏佽浜庡父鏁版椂闂村唴瀵硅搗澶寸榪涜鍏冪礌鐨勬彃鍏ユ垨縐婚櫎鎿嶄綔錛屼簩鍦ㄤ簬deque娌℃湁鎵璋撳閲忚蹇碉紝鍥犱負瀹冩槸鍔ㄦ佸湴浠ュ垎孌佃繛緇┖闂寸粍鍚堣屾垚錛岄殢鏃跺彲浠ュ鍔犱竴孌墊柊鐨勭┖闂村茍閾炬帴鍦ㄤ竴璧楓傛崲鍙ヨ瘽璇達紝鍍弙ector閭f牱"鍥犳棫絀洪棿涓嶈凍鑰岄噸鏂伴厤緗竴鍧楁洿澶х┖闂達紝鐒跺悗澶嶅埗鍏冪礌錛屽啀閲婃斁鏃х┖闂?榪欐牱鐨勪簨鎯呭湪 deque鏄笉浼氬彂鐢熺殑銆?br />
deque鏄敱涓孌典竴孌電殑瀹氶噺榪炵畫絀洪棿鏋勬垚銆備竴鏃︽湁蹇呰鍦╠eque鐨勫墠绔垨灝劇澧炲姞鏂扮┖闂達紝渚塊厤緗竴孌靛畾閲忚繛緇┖闂達紝涓叉帴鍦ㄦ暣涓猟eque鐨勫ご绔垨灝劇銆俤eque鐨勬渶澶т換鍔★紝渚挎槸鍦ㄨ繖浜涘垎孌電殑瀹氶噺榪炵畫絀洪棿涓婏紝緇存姢鍏舵暣浣撹繛緇殑鍋囪薄錛屽茍鎻愪緵闅忔満瀛樺彇鐨勬帴鍙c傞伩寮浜?閲嶆柊閰嶇疆錛屽鍒訛紝閲婃斁"鐨勮疆鍥烇紝浠d環(huán)鍒欐槸澶嶆潅鐨勮凱浠e櫒鏋舵瀯銆傚洜涓烘湁鍒嗘榪炵畫綰挎х┖闂達紝灝卞繀欏繪湁涓ぎ鎺у埗錛岃屼負浜嗙淮鎸佹暣浣撹繛緇殑鍋囪薄錛屾暟鎹粨鏋勭殑璁捐鍙婅凱浠e櫒鍓嶈繘鍚庨絳夋搷浣滈兘棰囦負綣佺悙銆?br />
deque閲囩敤涓鍧楁墍璋撶殑map浣滀負涓繪帶銆傝繖閲岀殑map鏄竴灝忓潡榪炵畫絀洪棿錛屽叾涓瘡涓厓绱犻兘鏄寚閽堬紝鎸囧悜鍙︿竴孌佃繛緇嚎鎬х┖闂達紝縐頒負緙撳啿鍖恒傜紦鍐插尯鎵嶆槸deque鐨勫瓨鍌ㄧ┖闂翠富浣撱係GI STL鍏佽鎴戜滑鎸囧畾緙撳啿鍖哄ぇ灝忥紝榛樿鍊?琛ㄧず灝嗕嬌鐢?12 bytes緙撳啿鍖恒?br />
錛堝洓錛塻tack
stack 鏄竴縐嶅厛榪涘悗鍑猴紙First In Last Out , FILO錛夌殑鏁版嵁緇撴瀯銆傚畠鍙湁涓涓嚭鍙o紝stack 鍏佽鏂板鍏冪礌錛岀Щ闄ゅ厓绱狅紝鍙栧緱鏈欏剁鍏冪礌銆備絾闄や簡鏈欏剁澶栵紝娌℃湁浠諱綍鍏跺畠鏂規(guī)硶鍙互瀛樺彇stack鐨勫叾瀹冨厓绱狅紝stack涓嶅厑璁?dāng)R亶鍘嗚涓恒?br />
浠ユ煇縐嶅鍣ㄤ綔涓哄簳閮ㄧ粨鏋勶紝灝嗗叾鎺ュ彛鏀瑰彉錛屼嬌涔嬬鍚?#8220;鍏堣繘鍚庡嚭”鐨勭壒鎬э紝褰㈡垚涓涓猻tack錛屾槸寰堝鏄撳仛鍒扮殑銆俤eque鏄弻鍚戝紑鍙g殑鏁版嵁緇撴瀯錛岃嫢浠eque涓哄簳閮ㄧ粨鏋勫茍灝侀棴鍏跺ご绔紑鍙o紝渚胯交鑰屾槗涓懼湴褰㈡垚浜嗕竴涓猻tack.鍥犳錛孲GI STL 渚夸互deque浣滀負緙虹渷鎯呭喌涓嬬殑stack搴曢儴緇撴瀯錛岀敱浜巗tack 緋諱互搴曢儴瀹瑰櫒瀹屾垚鍏舵墍鏈夊伐浣滐紝鑰屽叿鏈夎繖縐?淇敼鏌愮墿鎺ュ彛錛屽艦鎴愬彟涓縐嶉璨?涔嬫ц川鑰咃紝縐頒負adapter錛堥厤鎺ュ櫒錛夛紝鍥犳錛孲TL stack 寰寰涓嶈褰掔被涓篶ontainer(瀹瑰櫒)錛岃岃褰掔被涓?container adapter.
(浜旓級 queue
queue鏄竴縐嶅厛榪涘厛鍑?First In First Out,FIFO) 鐨勬暟鎹粨鏋勩傚畠鏈変袱涓嚭鍙o紝queue鍏佽鏂板鍏冪礌錛岀Щ闄ゅ厓绱狅紝浠庢渶搴曠鍔犲叆鍏冪礌錛屽彇寰楁渶欏剁鍏冪礌銆備絾闄や簡鏈搴曠鍙互鍔犲叆錛屾渶欏剁鍙互鍙栧嚭澶栵紝娌℃湁浠諱綍鍏跺畠鏂規(guī)硶鍙互瀛樺彇queue鐨勫叾瀹冨厓绱犮?br />
(鍏?heap
heap騫朵笉褰掑睘浜嶴TL瀹瑰櫒緇勪歡錛屽畠鏄釜騫曞悗鑻遍泟錛屾壆婕攑riority queue鐨勫姪鎵嬨俻riority queue鍏佽鐢ㄦ埛浠ヤ換浣曟搴忓皢浠諱綍鍏冪礌鎺ㄥ叆瀹瑰櫒涓紝浣嗗彇鍑烘椂涓瀹氭寜浠庝紭鍏堟潈鏈楂樼殑鍏冪礌寮濮嬪彇銆傛寜鐓у厓绱犵殑鎺掑垪鏂瑰紡錛宧eap鍙垎涓簃ax-heap鍜宮in-heap涓ょ錛屽墠鑰呮瘡涓妭鐐圭殑閿?key)閮藉ぇ浜庢垨絳変簬鍏跺瓙鑺傜偣閿鹼紝鍚庤呯殑姣忎釜鑺傜偣閿?key)閮藉皬浜庢垨絳変簬鍏跺瓙鑺傜偣閿箋傚洜姝わ紝 max-heap鐨勬渶澶у煎湪鏍硅妭鐐癸紝騫舵繪槸浣嶄簬搴曞眰array鎴杤ector鐨勮搗澶村錛沵in-heap鐨勬渶灝忓煎湪鏍硅妭鐐癸紝浜︽繪槸浣嶄簬搴曞眰array鎴杤ector璧峰ご澶勩係TL 渚涘簲鐨勬槸max-heap錛岀敤c++瀹炵幇銆?br />鍫嗘帓搴廲璇█瀹炵幇
錛堜竷錛塸riority_queue
priority_queue鏄竴涓嫢鏈夋潈鍊艱蹇電殑queue,瀹冨厑璁稿姞鍏ユ柊鍏冪礌錛岀Щ闄ゆ棫鍏冪礌錛屽瑙嗗厓绱犲肩瓑鍔熻兘銆傜敱浜庤繖鏄竴涓猶ueue錛屾墍浠ュ彧鍏佽鍦ㄥ簳绔姞鍏ュ厓绱狅紝騫朵粠欏剁鍙栧嚭鍏冪礌錛岄櫎姝や箣澶栧埆鏃犲叾瀹冨瓨鍙栧厓绱犵殑閫斿緞銆俻riority_queue甯︽湁鏉冨艱蹇碉紝鍏跺唴鐨勫厓绱犲茍闈炰緷鐓ц鎺ㄥ叆鐨勬搴忔帓鍒楋紝鑰屾槸鑷姩渚濈収鍏冪礌鐨勬潈鍊兼帓鍒楋紙閫氬父鏉冨間互瀹炲艱〃紺猴級銆傛潈鍊兼渶楂樿咃紝鎺掑湪鏈鍓嶉潰銆傜己鐪佹儏鍐典笅priority_queue緋誨埄鐢ㄤ竴涓猰ax-heap瀹屾垚錛屽悗鑰呮槸涓涓互vector琛ㄧ幇鐨?complete binary tree.max-heap鍙互婊¤凍priority_queue鎵闇瑕佺殑"渚濇潈鍊奸珮浣庤嚜鍔ㄩ掑噺鎺掑簭"鐨勭壒鎬с?br />priority_queue瀹屽叏浠ュ簳閮ㄥ鍣ㄤ綔涓烘牴鎹紝鍐嶅姞涓奾eap澶勭悊瑙勫垯錛屾墍浠ュ叾瀹炵幇闈炲父綆鍗曘傜己鐪佹儏鍐典笅鏄互vector涓哄簳閮ㄥ鍣ㄣ俼ueue浠ュ簳閮ㄥ鍣ㄥ畬鎴愬叾鎵鏈夊伐浣溿傚叿鏈夎繖縐?淇敼鏌愮墿鎺ュ彛錛屽艦鎴愬彟涓縐嶉璨?涔嬫ц川鑰咃紝縐頒負adapter(閰嶆帴鍣?錛屽洜姝わ紝STL priority_queue寰寰涓嶈褰掔被涓篶ontainer(瀹瑰櫒)錛岃岃褰掔被涓篶ontainer adapter.
(鍏?set,multiset
set鐨勭壒鎬ф槸錛屾墍鏈夊厓绱犻兘浼氭牴鎹厓绱犵殑閿艱嚜鍔ㄨ鎺掑簭銆俿et鐨勫厓绱犱笉鍍弇ap閭f牱鍙互鍚屾椂鎷ユ湁瀹炲?value)鍜岄敭鍊?key), set 鍏冪礌鐨勯敭鍊煎氨鏄疄鍊鹼紝瀹炲煎氨鏄敭鍊鹼紝set涓嶅厑璁鎬袱涓厓绱犳湁鐩稿悓鐨勫箋俿et鏄氳繃綰㈤粦鏍?wèi)鏉ュ疄鐜扮殑锛岀斪兒幘U㈤粦鏍?wèi)锛圧B-tree錛夋槸涓縐嶅鉤琛′簩鍙夋悳绱㈡爲(wèi)錛岃嚜鍔ㄦ帓搴忕殑鏁堟灉寰堜笉閿欙紝鎵浠ユ爣鍑嗙殑STL鐨剆et鍗充互RB-Tree涓哄簳灞傛満鍒躲傚張鐢變簬set鎵寮鏀劇殑鍚勭鎿嶄綔鎺ュ彛錛孯B-tree涔熼兘鎻愪緵浜嗭紝鎵浠ュ嚑涔庢墍鏈夌殑set鎿嶄綔琛屼負錛岄兘鍙湁杞皟鐢≧B-tree鐨勬搷浣滆涓鴻屽凡銆?br />
multiset鐨勭壒鎬т互鍙婄敤娉曞拰set瀹屽叏鐩稿悓錛屽敮涓鐨勫樊鍒湪浜庡畠鍏佽閿奸噸澶嶏紝鍥犳瀹冪殑鎻掑叆鎿嶄綔閲囩敤鐨勬槸搴曞眰鏈哄埗RB-tree鐨刬nsert_equal()鑰岄潪insert_unique().
錛堜節(jié)錛塵ap,multimap
map鐨勭壒鎬ф槸錛屾墍鏈夊厓绱犻兘浼氭牴鎹厓绱犵殑閿艱嚜鍔ㄨ鎺掑簭銆俶ap鐨勬墍鏈夊厓绱犻兘鏄痯air,鍚屾椂鎷ユ湁瀹炲鹼紙value錛夊拰閿鹼紙key錛? pair鐨勭涓鍏冪礌琚涓洪敭鍊鹼紝絎簩鍏冪礌琚涓哄疄鍊箋俶ap涓嶅厑璁鎬袱涓厓绱犳嫢鏈夌浉鍚岀殑閿?鐢變簬RB-tree鏄竴縐嶅鉤琛′簩鍙夋悳绱㈡爲(wèi)錛岃嚜鍔ㄦ帓搴忕殑鏁堟灉寰堜笉閿欙紝鎵浠ユ爣鍑嗙殑STL map鍗充互RB-tree涓哄簳灞傛満鍒躲傚張鐢變簬map鎵寮鏀劇殑鍚勭鎿嶄綔鎺ュ彛錛孯B-tree涔熼兘鎻愪緵浜嗭紝鎵浠ュ嚑涔庢墍鏈夌殑map鎿嶄綔琛屼負錛岄兘鍙槸杞皟RB-tree鐨勬搷浣滆涓恒?br />multimap鐨勭壒鎬т互鍙婄敤娉曚笌map瀹屽叏鐩稿悓錛屽敮涓鐨勫樊鍒湪浜庡畠鍏佽閿奸噸澶嶏紝鍥犳瀹冪殑鎻掑叆鎿嶄綔閲囩敤鐨勬槸搴曞眰鏈哄埗RB-tree鐨刬nsert_equal()鑰岄潪insert_unique銆?
]]>
鍙傝冿細STL婧愮爜鍒嗘瀽
]]>
#ifndef _JJALLOC_
#define _JJALLOC_
#include<new>
#include<cstddef>
#include<cstdlib>
#include<climits>
#include<iostream>
using namespace std;
namespace JJ
{
template<class T>
inline T* _allocate(ptrdiff_t size,T*)
{
set_new_handler(0);
T *tmp=(T*)(::operator new((size_t)(size* sizeof(T))));
if(tmp==0){
cerr<<"out of memory"<<endl;
exit(1);
}
return tmp;
}
template<class T>
inline void _deallocate(T* buffer)
{
::operator delete(buffer);
}
template<class T1,class T2>
inline void _construct(T1 *p,const T2& value)
{
new(p)T1(value);//placement new operator
}
template<class T>
inline void _destroy(T* ptr)
{
ptr->~T();
}
template<class T>class allocator{
public:
typedef T value_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
template<class U>
struct rebind
{
typedef allocator<U>other;
};
pointer allocate(size_type n,const void * hint=0)
{
return _allocate((difference_type)n,(pointer)0);
}
void deallocate(pointer p,size_type n)
{
_deallocate(p);
}
void construct(pointer p,const T& value)
{
_construct(p,value);
}
void destroy(pointer p){_destroy(p);}
pointer address(reference x){return (pointer)&x;}
const_pointer const_address(const_reference x)
{
return (const_pointer)&x;
}
size_type max_size()const{
return size_type(UINT_MAX/sizeof(T));
}
};
}//end of namespace JJ
#endif
//jjalloc.cc,嫻嬭瘯涓婇潰榪欎釜綆鍗曠殑閰嶇疆鍣?br>#include"jjalloc.h"
#include<vector>
#include<iostream>
using namespace std;
int main()
{
int ia[5]={0,1,2,3,4};
unsigned int i;
vector<int,JJ::allocator<int> >iv(ia,ia+5);
for(i=0;i<iv.size();i++)
cout<<iv[i]<<' ';
cout<<endl;
}
]]>