锘??xml version="1.0" encoding="utf-8" standalone="yes"?>极品日韩av,亚洲一区二区免费视频,亚洲成人影音 http://www.shnenglu.com/lwch/category/19336.html銆怮Q:510134884銆戙怑mail:<a href="mailto:lwch748@gmail.com">lwch748@gmail.com</a>銆?/description>zh-cnTue, 30 Apr 2013 12:57:36 GMTTue, 30 Apr 2013 12:57:36 GMT60QCore/Library璇存槑鏂囨。http://www.shnenglu.com/lwch/archive/2013/04/30/199861.htmllwchlwchTue, 30 Apr 2013 12:24:00 GMThttp://www.shnenglu.com/lwch/archive/2013/04/30/199861.htmlhttp://www.shnenglu.com/lwch/comments/199861.htmlhttp://www.shnenglu.com/lwch/archive/2013/04/30/199861.html#Feedback0http://www.shnenglu.com/lwch/comments/commentRss/199861.htmlhttp://www.shnenglu.com/lwch/services/trackbacks/199861.htmlQCore/Library璇存槑鏂囨。

鏉庢枃瓚?

鍓嶈█

 

QCore/Library鏄竴濂楃被STL鐨勭被搴擄紝瀹冨湪鏍囧噯搴撶殑鑼冨洿鍐呭垹鍘諱簡涓嶅父鐢ㄧ殑heap銆乨eque絳夌粨鏋勶紙鑷沖皯鎴戞槸涓嶅父鐢ㄧ殑錛夈傚茍涓轟竴浜涘鍣ㄦ彁渚涗簡涓浜涚壒孌婄殑鎺ュ彛錛屾瘮濡倂ector涓殑push_back_unique銆乤dd鍜宎dd_unique絳夈?

 

Library涓昏鍒嗕負鍏儴鍒嗭紝鍐呭瓨璋冭瘯鐩稿叧銆佸鍣ㄣ佺畻娉曘佹鍒欍両O鍜孏raphic錛屾瘡涓ā鍧楅兘鏈夊悇鑷殑鍒嗗伐錛屼粬浠箣闂寸殑鑰﹀悎搴︽瀬浣庯紝鍑犱箮姣忎釜妯″潡閮藉彲浠ユ媶鍑烘潵鐙珛浣跨敤錛屼笅闈㈡潵鍒嗗埆浠嬬粛鍚勪釜妯″潡銆?

鍐呭瓨璋冭瘯

 

鎴戜滑鐭ラ亾錛屽湪C/C++涓唴瀛樼浉鍏崇殑涓滆タ鏄瀬闅炬帶鍒剁殑錛屽湪浣跨敤涓嶅綋鏃跺彲鑳介犳垚鍚勭閿欒錛岃交鍒欏唴瀛樻硠婕忥紝閲嶅垯紼嬪簭宕╂簝銆傛墍浠ワ紝鍦ㄧ敓浜х幆澧冧腑鎴戜滑蹇呴』閫氳繃涓涓湁鏁堢殑鎵嬫鏉ョ鐞嗗ソ鍐呭瓨銆傚綋鐒訛紝鍦ㄥ皬鍧楀唴瀛橀綣乶ew銆乨elete鐨勮繃紼嬩腑涔熶細浜х敓澶ч噺鐨勫唴瀛樼鐗囷紝浠庤屽鑷村彲鐢ㄥ唴瀛樻暟閲忚秺鏉ヨ秺灝戙傚簲姝ゆ垜浠璁′簡涓涓唴瀛樻睜鏉ユ帶鍒跺皬鍧楀唴瀛樼殑棰戠箒new銆乨elete錛屼互鍙婂仛鍒板鍐呭瓨娉勬紡鐨勬嫻嬨?

 

鍦ㄥ唴瀛樻睜鐨勮璁′箣鍒濓紝鎴戝彧鏄畝鍗曠殑璁捐鍑轟簡鍙互浣跨敤鐨凪emoryPool鐨勬渶綆鐗堟湰錛屽畠鍖呭惈涓涓ぇ鍧楀唴瀛樼殑free_list鍜屾瘡涓皬鍧楀唴瀛樼殑chunk_list錛屽綋鏃惰凍浠ュ簲浠樺ぇ閮ㄥ垎鐨勯渶姹傦紝鑰屼笖鏈鍒濈敤鐨勬槸Visual Leak Detector鏉ユ嫻嬪唴瀛樻硠婕忋備絾闅忕潃鏃墮棿鐨勬帹縐伙紝鎯寵鑷繁媯嫻嬪唴瀛樻硠婕忕殑嬈叉湜瓚婃潵瓚婂己鐑堬紝涔嬪悗渚挎湁浜嗕竴涓猽se_list鏉ヤ繚瀛樺唴瀛樺潡鐨勯噴鏀炬儏鍐點傚綋鏃跺畬鎴愪簡榪欎釜patch涔嬪悗錛屽叴濂嬬殑璺戜簡涓涓婽estCase錛岀劧鍚庣殑緇撴灉鎴戞兂澶у搴旇鐭ラ亾浜嗭紝涓璺殑椋樼孩錛屽埌澶勬槸鍐呭瓨娉勬紡銆?

 

緇忚繃涓澶╃殑璋冭瘯錛屽疄鍦ㄦ棤娉曞蹇嶇殑鎯呭喌涓嬶紝鎴戠炕闃呬簡MSDN錛屾煡鍒頒簡dbghelp.dll涓彲浠ラ氳繃璁稿鍑芥暟鏉ヨ幏鍙栬皟鐢ㄥ爢鏍堬紝浜庢槸鍦ㄦ涔嬩笅渚跨敓浜у嚭浜咰allStack妯″潡銆傛湁浜嗗畠涔嬪悗浣犲氨鍙互鍦ㄤ換鎰忓湴鏂逛繚瀛樺綋鍓嶇殑璋冪敤鍫嗘爤浜嗭紝鐪熸槸鍗佸垎鏂逛究銆傚綋鐒剁洿鍒扮幇鍦紝瀹冭繕鍙敮鎸佸湪Windows涓嬭皟鐢ㄥ爢鏍堢殑鑾峰彇錛堢◢鍚庢垜浼氱炕闃呰祫鏂欙紝瀹炵幇涓涓猯ike unix鐨勭増鏈紝濡傛灉鍙兘鐨勮瘽錛夈?

 

榪欓噷涓嶈繃澶氱殑鎻忚堪瀹炵幇鐨勭粏鑺傦紝鍏蜂綋鍙互鐪?a href="http://www.shnenglu.com/lwch/archive/2012/07/14/183420.html">http://www.shnenglu.com/lwch/archive/2012/07/14/183420.html鍜?a href="http://www.shnenglu.com/lwch/archive/2013/01/19/197415.html">http://www.shnenglu.com/lwch/archive/2013/01/19/197415.html涓ょ瘒鏂囩珷銆?

 

鏈鍚庢潵鐪媋llocator錛岃繖閲屽彧鏄畝鍗曠殑涓哄叾鍖呰浜嗕竴灞傘?

 

template <typename T>

class allocator

{

public:

    allocator()

    {

    }

 

    allocator(const allocator<T>&)

    {

    }

 

    static T* allocate()

    {

        MemoryPool* pool = getPool();

        return reinterpret_cast<T*>(pool->allocate(sizeof(T), free_handler));

    }

 

    static T* allocate(size_t n)

    {

        MemoryPool* pool = getPool();

        return reinterpret_cast<T*>(pool->allocate(n * sizeof(T), free_handler));

    }

 

    static void deallocate(T* p)

    {

        MemoryPool* pool = getPool();

        pool->deallocate(p, sizeof(T));

    }

 

    static void deallocate(T* p, size_t n)

    {

        MemoryPool* pool = getPool();

        pool->deallocate(p, n * sizeof(T));

    }

 

    static void deallocateWithSize(T* p, size_t n)

    {

        MemoryPool* pool = getPool();

        pool->deallocate(p, n);

    }

 

    static T* reallocate(T* p, size_t old_size, size_t n)

    {

        MemoryPool* pool = getPool();

        return pool->reallocate(p, old_size, n * sizeof(T), free_handler);

    }

public:

    static void(*free_handler)(size_t);

 

    static void set_handler(void(*h)(size_t))

    {

        free_handler = h;

    }

protected:

    static MemoryPool* getPool()

    {

        static MemoryPool pool;

        return &pool;

    }

};

 

template <typename T>

void (*allocator<T>::free_handler)(size_t) = 0;

瀹瑰櫒

 

瀹瑰櫒鍗犱簡Library鐨勫ぇ閮ㄥ垎錛屽鍣ㄧ殑浣滅敤鏄敤鏉ュ瓨鍌ㄥ璞$殑錛屽鍣ㄥ垎涓虹嚎鎬у拰闈炵嚎鎬т袱縐嶃傜嚎鎬х殑瀹瑰櫒鏈塿ector銆乴ist銆乻tring浠ュ強鐢ㄥ畠浠綔涓哄鍣ㄥ疄鐜扮殑queue銆乻tack鍥涚錛岄潪綰挎х殑鍒欐湁rbtree銆乭ashtable浠ュ強鐢ㄥ畠浠綔涓哄鍣ㄥ疄鐜扮殑set銆乵ap銆乭ashset銆乭ashmap鍏銆傚浜庢瘡縐嶅鍣紝閮藉繀欏誨畾涔夊嚭瀹冪殑value_type銆乸ointer銆乺eference銆乧onst_reference銆乻ize_type銆乨istance_type銆乧onst_iterator銆乧onst_reverse_iterator銆乮terator銆乺everse_iterator鐨勭被鍨嬨?

 

鎵鏈夊鍣ㄥ繀欏誨寘鍚互涓嬪嚑涓帴鍙o細size錛堣幏鍙栧鍣ㄥ唴鍏冪礌涓暟錛夈乧lear錛堟竻絀哄鍣級銆乥egin錛堣幏鍙朳first,last)鍖洪棿涓殑first榪唬鍣級銆乪nd錛堣幏鍙朳first,last)鍖洪棿涓殑last榪唬鍣級銆乺begin錛堣幏鍙栧弽鍚戠殑first榪唬鍣級銆乺end錛堣幏鍙栧弽鍚戠殑last榪唬鍣級銆?

traits

 

traits鏄竴縐嶈悆鍙栨妧鏈紝閫氳繃瀹冧綘鍙互鑾峰彇鏌愮綾誨瀷鐨勪竴浜涚壒鎬э紝姣斿鏄惁鍚湁榛樿鏋勯犲嚱鏁般佹嫹璐濇瀯閫犲嚱鏁扮瓑銆?

__type_traits

 

__type_traits鐢ㄤ簬钀冨彇鍑烘煇縐嶇被鍨嬬殑涓浜涚壒鎬э紝瀹冪殑鍘熷瀷濡備笅

 

template <typename T>

struct __type_traits

{

    typedef __true_type has_default_construct;

    typedef __true_type has_copy_construct;

    typedef __true_type has_assign_operator;

    typedef __true_type has_destruct;

    typedef __false_type is_POD;

};

閫氳繃鐗逛緥鍖栵紝鍙互瀹氫箟鍑烘墍鏈夌被鍨嬬殑榪欎簺灞炴э紝姣斿char

 

template <>

struct __type_traits<char>

{

    typedef __true_type has_default_construct;

    typedef __true_type has_copy_construct;

    typedef __true_type has_assign_operator;

    typedef __false_type has_destruct;

    typedef __true_type is_POD;

};

__container_traits

 

__container_traits鐢ㄤ簬钀冨彇鍑哄鍣ㄧ殑鐗規э紝濡備笂鏂囨墍璇寸殑value_type絳夌壒鎬э紝瀹冪殑浠g爜寰堢畝鍗?

 

template <typename T>

struct __container_traits

{

    typedef typename T::value_type value_type;

    typedef typename T::pointer pointer;

    typedef typename T::reference reference;

    typedef typename T::const_reference const_reference;

    typedef typename T::size_type size_type;

    typedef typename T::distance_type distance_type;

    typedef typename T::const_iterator const_iterator;

    typedef typename T::const_reverse_iterator const_reverse_iterator;

    typedef typename T::iterator iterator;

    typedef typename T::reverse_iterator reverse_iterator;

};

char_traits

 

char_traits瀹氫箟浜嗕竴浜涘浜嶤har鐨勬搷浣滐紝鍖呮嫭assign錛堣祴鍊鹼級銆乪q錛堢浉絳夛級銆乴t錛堝皬浜庯級銆乧ompare錛堟瘮杈冧袱涓瓧絎︿覆鐨勫ぇ灝忥級銆乴ength錛堣幏鍙栧瓧絎︿覆鐨勯暱搴︼級銆乵ove錛堢Щ鍔級銆乧opy錛堟嫹璐濓級銆乤ssign錛堝瓧絎︿覆璧嬪鹼級銆乪of錛堢粨鏉熺錛夛紝瀹冪殑浠g爜姣旇緝綆媧侊紝榪欓噷涓嶅仛璇存槑銆?

type_compare

 

type_compare鐢ㄤ簬瀵逛袱縐嶇被鍨嬪仛榪愯鏃剁殑鍖歸厤錛屽垽鏂墍緇欏畾鐨勪袱縐嶇被鍨嬫槸鍚︾浉鍚屻傚悓鏍烽氳繃鐗逛緥鍖栨妧鏈彲浠ュ緢杞繪澗鐨勫疄鐜板畠鐨?a href="../Source/QCore/Library/traits.h">浠g爜銆?

榪唬鍣?

 

榪唬鍣ㄧ被鏄竴縐嶇被浼間簬smart pointer鐨勪笢瑗匡紝涓鑸殑瀹冮兘浼氭敮鎸佸墠緗拰鍚庣疆鐨?+鍜?-鎿嶄綔錛屾湁涓浜涚壒孌婄殑榪唬鍣ㄥ悓鏍鋒敮鎸?=鍜?=鎿嶄綔銆傚綋鐒朵綔涓轟竴縐峴mart pointer灝戜笉浜嗙殑鏄?>鍜?鎿嶄綔錛岃屽浜庢瘮杈冩搷浣滐紝鍒欐瘮杈冪殑鏄凱浠e櫒鎵淇濆瓨鐨勫箋?

 

榪唬鍣ㄥ垎涓篵idirectional_iterator鍜宺andom_access_iterator涓ょ綾誨瀷錛屽墠鑰呭彧鏀寔++鍜?-鎿嶄綔鑰屽悗鑰呮敮鎸?鍜?榪愮畻絎︼紝涔嬫墍浠ヤ細瀹氫箟鍑鴻繖涓ょ綾誨瀷鏄負浜嗘彁楂樼畻娉曠殑閫熷害銆傚浜庝竴涓凱浠e櫒鏉ヨ鍚屾牱闇瑕佸畾涔塿alue_type銆乨istance_type銆乸ointer銆乺eference銆乧onst_pointer銆乧onst_reference鐨勭被鍨嬨?

 

鍙嶅悜榪唬鍣?

 

鍙嶅悜榪唬鍣ㄤ笌姝e悜鐨勬濂界浉鍙嶏紝搴旀鎴戜滑鍙互綾諱技鐨勫畾涔夊畠鐨?+涓烘鍚戣凱浠e櫒鐨?-絳夎繍綆楃

iterator_traits

 

iterator_traits鐢ㄤ簬钀冨彇鍑鴻凱浠e櫒鐨勬墍鏈夌壒鎬э紝搴旀瀹冩瘮杈冪畝鍗?

 

template <typename Iterator>

struct iterator_traits

{

    typedef typename Iterator::value_type value_type;

    typedef typename Iterator::distance_type distance_type;

    typedef typename Iterator::pointer pointer;

    typedef typename Iterator::reference reference;

    typedef typename Iterator::const_pointer const_pointer;

    typedef typename Iterator::const_reference const_reference;

};

vector

 

vector鏄竴縐嶆瘮杈冨父鐢ㄧ殑瀹瑰櫒錛屽畠鐨勫唴閮ㄦ槸涓涓繛緇殑鍐呭瓨鍧楋紝搴旀瀹冩湁涓や釜鎺ュ彛鍒嗗埆鐢ㄤ簬鑾峰彇鍐呭瓨鍧楀凡浣跨敤鐨勫ぇ灝忓拰瀹瑰櫒鐨勫ぇ灝忥紝瀹冧滑鏄痵ize鍜宑apacity錛屽悓鏍峰畠涔熸湁涓涓猺eserve鎺ュ彛鏉ヨ皟鏁村畠鐨勫閲忋傜敱浜巚ector鐨勫唴閮ㄦ槸榪炵畫鐨勶紝搴旀瀹冨彧鍏佽浠庡悗闈㈡彃鍏ュ厓绱狅紝鎵浠ュ畠鏈塸ush_back銆乸ush_back_unique鍜宲op_back鏂規硶銆傚綋鐒朵負浜嗕綔涓簈ueue鐨勫鍣紝鎴戣繕涓哄叾澧炲姞浜唒op_front鏂規硶鐢ㄤ簬鍒犻櫎鍓嶇鐨勫厓绱犮俰nsert鍜宔rase鐢ㄤ簬鍦ㄦ煇涓湴鏂規彃鍏ュ拰鍒犻櫎鍏冪礌錛宎dd鍜宎dd_unique鐢ㄤ簬鎻掑叆鍙︿竴涓獀ector閲岀殑鍐呭錛岃寀nique鍒欎細灝嗗鍣ㄥ唴閲嶅鐨勫厓绱犲垹闄ゃ?

 

褰撶劧vector鍙互鍍忔暟緇勪竴鏍風殑浣跨敤錛屽畠鏀寔鏂規嫭鍙風殑榪愮畻絎︿笌at鎺ュ彛鏉ヨ幏鍙栨煇涓綅緗笂鐨勫厓绱犲箋?

 

vector瀹瑰櫒灝卞厛浠嬬粛鍒拌繖閲岋紝瀹冪殑浠g爜浣犲彲浠ュ湪QCore/Library/vector.h涓壘鍒般?

list

 

list鐨勫唴閮ㄥ垯鏄竴涓弻鍚戠殑閾捐〃錛屽簲姝ゅ畠鍦ㄥ垹闄ゅ墠绔殑鍏冪礌鏃朵細姣攙ector蹇緢澶氾紝瀹冪殑鎺ュ彛鍩烘湰璺焩ector鐩稿悓錛岃繖閲屽氨涓嶅仛榪囧鐨勪粙緇嶄簡銆傜敱浜巚ector鏄唴瀛樿繛緇殑錛屾墍浠ュ畠鍙互鐩存帴閫氳繃绱㈠紩鏉ヨ闂煇涓厓绱狅紝鑰宭ist鏄竴涓弻鍚戠殑閾捐〃錛屽簲姝ら氳繃鍒跺畾绱㈠紩鍘昏闂煇涓厓绱犳椂浼氬厛鐪嬭繖涓儲寮曠殑鍊兼槸鍚﹀皬浜巐ist闀垮害鐨勪竴鍗婃潵鍐沖畾鏄粠list鐨勫ご閮ㄩ亶鍘嗚繕鏄粠list鐨勫熬閮ㄩ亶鍘嗭紝瀹冪殑浠g爜浣犲彲浠ュ湪QCore/Library/list.h涓壘鍒般?

queue鍜宻tack

 

queue鏄竴縐岶IFO錛堝厛榪涘厛鍑猴級鐨勭粨鏋勶紝搴旀鎴戜滑寤鴻浣跨敤list浣滀負瀹冪殑瀹瑰櫒錛岄氳繃list鐨刾ush_back鍜宲op_front鍙互浣夸唬鐮佸彉鐨勯珮鏁堛傚畠鎷ユ湁front鍜宐ack鏂規硶鏉ヨ幏鍙栭槦鍒椾腑闃熷ご鍜岄槦灝劇殑鍏冪礌鍊鹼紝鍚屾牱鍦ㄦ彃鍏ラ槦鍒楁椂錛屼綘鍙互涓嶅姞閫夋嫨鐨勭洿鎺ユ彃鍏ユ垨鏄彃鍏ヤ竴涓笉閲嶅鐨勫箋?

 

stack鏄竴縐岶ILO錛堝厛榪涘悗鍑猴級鐨勭粨鏋勶紝鍚屾牱瀹冩嫢鏈塸ush銆乸ush_unique鍜宲op鏂規硶浠ュ強top鍜宐ottom鏂規硶鐢ㄤ簬鑾峰彇鏍堥《绔拰搴曢儴鐨勫厓绱犲箋?

 

瀵逛簬榪欎袱縐嶇粨鏋勭殑浠g爜錛屼綘鍙互鍦?a href="../Source/QCore/Library/queue.h">QCore/Library/queue.h鍜?a href="../Source/QCore/Library/stack.h">QCore/Library/stack.h涓壘鍒般?

rbtree

 

rbtree錛堢孩榛戞爲錛夋槸涓媯佃嚜騫寵 鐨勪簩鍙夋煡鎵炬爲錛屽簲姝ゅ畠鎷ユ湁杈冮珮鐨勬煡鎵炬晥鐜囷紝綰㈤粦鏍戞湁浠ヤ笅5鏉℃ц川

 

鎬ц川1. 鑺傜偣鏄孩鑹叉垨榛戣壊銆?

鎬ц川2. 鏍硅妭鐐規槸榛戣壊銆?

鎬ц川3 姣忎釜鍙惰妭鐐規槸榛戣壊鐨勩?

鎬ц川4 姣忎釜綰㈣壊鑺傜偣鐨勪袱涓瓙鑺傜偣閮芥槸榛戣壊銆?浠庢瘡涓彾瀛愬埌鏍圭殑鎵鏈夎礬寰勪笂涓嶈兘鏈変袱涓繛緇殑綰㈣壊鑺傜偣)

鎬ц川5. 浠庝換涓鑺傜偣鍒板叾姣忎釜鍙跺瓙鐨勬墍鏈夎礬寰勯兘鍖呭惈鐩稿悓鏁扮洰鐨勯粦鑹茶妭鐐廣?

浠ヤ笂鎽樿嚜鐧懼害鐧劇

 

瀵逛簬綰㈤粦鏍戠殑姣忎釜鑺傜偣錛屽畠閮芥嫢鏈夊畠鐨刱ey鍜寁alue錛屽綋鐒舵垜浠槸鎸夌収鑺傜偣鐨刱ey鏉ユ帓搴忕殑錛堝簾璇濓級銆傜孩榛戞爲鎷ユ湁insert_equal鍜宨nsert_unique鏂規硶鍒嗗埆鐢ㄤ簬鎻掑叆涓涓妭鐐癸紝鍓嶈呭厑璁稿緟鎻掑叆鑺傜偣鐨刱ey宸插瓨鍦ㄤ簬榪欐5鏍戜腑錛岃屽悗鑰呭湪鎻掑叆鏃跺茍涓嶅厑璁歌繖涓妭鐐圭殑key宸插瓨鍦ㄤ簬榪欐5鏍戜腑錛屽簲姝ゅ畠鐨勮繑鍥炲煎垯鏄竴涓簩鍏冪殑銆俥rase鏂規硶鍒欐彁渚涗簡瀵逛簬鏍戜腑鏌愪釜鑺傜偣鐨勫垹闄ゆ搷浣滐紝鍙互閫氳繃榪唬鍣ㄦ垨鏌愪釜key鍊兼潵鍒犻櫎鍏朵腑鐨勮妭鐐廣?

 

鐢變簬綰㈤粦鏍戞槸涓媯典簩鍙夋煡鎵炬爲錛屽簲姝ゅ畠搴旇鍏峰find鏂規硶錛岀敤浜庡湪鏍戜腑鏌ユ壘鏌愪釜鑺傜偣錛屽畠榪斿洖鐨勫垯鏄寚鍚戣繖涓妭鐐圭殑涓涓凱浠e櫒銆傜敱浜庣孩榛戞爲鏄湁搴忕殑錛屽簲姝ゅ彲浠ラ氳繃maximum鍜宮inimum鏂規硶寰楀埌鍏朵腑鐨勬渶澶у拰鏈灝忓箋傞氳繃lower_bound鍜寀pper_bound鍙互寰楀埌灞炰簬鏌愪釜key鐨刐first,last]鍖洪棿錛宔qual_range灝辨槸騫茶繖涓椿鐨勶紝count鏂規硶鍙互寰楀埌鏌愪釜key鎵瀵瑰簲鐨勮妭鐐規暟銆?

 

rbtree灝卞厛浠嬬粛鍒拌繖閲岋紝紼嶅悗鎴戜細鍦ㄥ崥瀹腑緇х畫鏇存柊鎻愪緵鏇村畬鏁寸殑瀹炵幇鏂規硶錛屽畠鐨勪唬鐮佷綘鍙互鍦?a href="../Source/QCore/Library/rbtree.h">QCore/Library/rbtree.h涓壘鍒般?

set鍜宮ap

 

set鏄竴縐嶉泦鍚堢殑緇撴瀯錛屽簲姝ゅ湪闆嗗悎涓槸涓嶅厑璁告湁閲嶅鐨勫厓绱犵殑錛宻et鏄互rbtree浣滀負瀹瑰櫒鐨勩傚簲姝ゅ畠鐨刬nsert鏂規硶瀵瑰簲浜巖btree鐨刬nsert_unique鏂規硶錛屽悓鏍穜btree鎵鍏峰鐨勬帴鍙et涔熷悓鏍鋒嫢鏈夛紝set鐨刱ey_type涓巚alue_type鐩稿悓錛岄兘鏄粰瀹氱殑綾誨瀷銆?

 

map鍒欐槸涓縐峩ey-value鐨刣irectory緇撴瀯錛屽簲姝ゅ畠鐨刱ey鏄笉鍏佽閲嶅鐨勶紝map鍚屾牱鏄互rbtree浣滀負瀹瑰櫒鐨勩傚簲姝ゅ畠鐨刬nsert鏂規硶鍚屾牱瀵瑰簲浜巖btree鐨刬nsert_unique鏂規硶錛屽湪map涓櫎浜唕btree鐨刴aximum銆乵inimum銆乴ower_bound銆乽pper_bound銆乪qual_range鍜宑ount娌℃湁涔嬪鍏朵粬鎺ュ彛鍩烘湰鍏ㄩ兘鎷ユ湁錛宮ap鐨刱ey_type鏄粰瀹氱殑綾誨瀷錛岃寁alue_type鍒欐槸涓涓互Key鍜孴緇勬垚鐨勪簩鍏冪粍銆?

 

瀵逛簬榪欎袱縐嶇粨鏋勭殑浠g爜錛屼綘鍙互鍦?a href="../Source/QCore/Library/set.h">QCore/Library/set.h鍜?a href="../Source/QCore/Library/map.h">QCore/Library/map.h涓壘鍒般?

hashtable

 

hashtable鏄竴縐嶅搱甯岀粨鏋勶紝搴旀瀹冪殑鍏冪礌鏌ユ壘鍜屾彃鍏ユ槸闈炲父蹇殑銆傚湪榪欓噷鎴戠敤鐨勬槸鍚婃《娉曟潵澶勭悊鍏冪礌鎻掑叆鏃剁殑鍐茬獊錛屽綋鍚婃《闀垮害榪囬暱錛堥粯璁ゆ槸11涓厓绱狅級鏃訛紝浼氬皢妗剁殑澶у皬緲諱竴鍊嶇劧鍚庨噸寤烘暣涓猦ashtable浠ユ彁楂榟ashtable涓厓绱犵殑鏌ユ壘閫熷害銆?

 

鍚屾牱鐨勫湪hashtable涓湁insert_equal鍜宨nsert_unique鏉ュ垎鍒彃鍏ュ厑璁哥浉鍚屽拰涓嶅悓鐨勫厓绱狅紝褰撻亣鍒頒竴涓凡鏈夌殑鍏冪礌鏃朵細灝嗚繖涓厓绱犳彃鍏ュ埌絎竴涓笌瀹冨肩浉鍚岀殑鑺傜偣鍚庨潰錛岃繖鏍峰仛鐨勫ソ澶勬槸鍙互綆鍗曠殑瀹炵幇equal_range鏂規硶銆傚悓鏃秇ashtable鎷ユ湁value鏂規硶鐢ㄤ簬閫氳繃涓涓寚瀹氱殑key鏉ユ煡鎵懼埌瀹冨搴旂殑鍊鹼紝find鏂規硶鍒欐槸鐢ㄦ潵鏌ユ壘涓涓猭ey鎵瀵瑰簲鐨勮凱浠e櫒鐨勩傚悓鏍風殑hashtable涔熸嫢鏈塩ount鏂規硶鏉ヨ幏鍙栨煇涓猭ey鎵瀵瑰簲鐨勫肩殑涓暟錛宮aximum鍜宮inimum鍒欐槸鐢ㄦ潵鑾峰彇鏈澶у煎拰鏈灝忓肩殑銆?

 

hashtable鐨勪唬鐮侊紝浣犲彲浠ュ湪QCore/Library/hashtable.h涓壘鍒般?

hashset鍜宧ashmap

 

hashset鍜宧ashmap鍩烘湰涓巗et鍜宮ap鐩稿悓錛岃繖閲屼笉榪囧鍋氫粙緇嶏紝鍏充簬瀹冧滑鐨勪唬鐮侊紝浣犲彲浠ュ湪QCore/Library/hashset.h鍜?a href="../Source/QCore/Library/hashmap.h">QCore/Library/hashmap.h涓壘鍒般?

basic_string

 

basic_string鐨勫疄鐜版柟寮忓熀鏈拰vector宸笉澶氾紝涓轟簡鎻愰珮鏁堢巼錛屽湪鎵鏈夌殑鎻掑叆鎿嶄綔涓嫢鏂扮殑闀垮害鐨勪竴鍊嶅皬浜庝竴涓畾闀匡紙榛樿鏄?12錛夊瓧鑺傛椂浼氱敵璇鋒柊闀垮害鐨勪竴鍊嶄綔涓哄鍣ㄧ殑瀹歸噺銆?

 

涓巚ector涓嶅悓鐨勬槸basic_string鎷ユ湁c_str鍜宒ata鏂規硶鐢ㄤ簬鑾峰彇瀛楃鎸囬拡錛宎ppend鏂規硶寰瀛楃涓插熬閮ㄩ摼鎺ュ彟涓涓瓧絎︿覆錛宎ssign鏂規硶緇欏瓧絎︿覆璧嬪鹼紝find鏂規硶鏌ユ壘鍒扮涓涓寚瀹氱殑瀛楃涓茬殑浣嶇疆錛宻ubstr鍒欑敤鏉ヨ幏鍙栧瓧絎︿覆涓竴閮ㄥ垎鐨勫唴瀹廣?

 

鍦╞asic_string涓篃鏈塮ormat鐨勯潤鎬佹柟娉曟潵鐢熸垚涓涓寚瀹氬艦寮忕殑瀛楃涓詫紝鍏朵粬鐢ㄦ硶鍩烘湰涓巚ecotr鐩稿悓銆傚畠鐨勪唬鐮侊紝浣犲彲浠ュ湪QCore/Library/string.h涓壘鍒般?

鏈珷灝忕粨

 

涓婇潰浠嬬粛浜嗘墍鏈夌殑瀹瑰櫒鐨勬帴鍙e拰浣跨敤鏂規硶錛屼互鍙婂湪瀹炵幇鏂瑰紡涓婄殑涓浜涙妧宸с傚笇鏈涢氳繃涓婇潰鐨勪粙緇嶏紝璇昏呬滑鑳藉浣撲細鍒癝TL涓轟粈涔堥渶瑕佽繖涔堝幓璁捐銆佽繖涔堣璁$殑濂藉鏄粈涔堛?

 

鍦ㄦ垜鍚庢潵鍋歳egex鐨勮繃紼嬩腑錛屾垜娣卞埢鐨勪綋浼氬埌錛岄夌敤涓涓悎閫傜殑鏁版嵁緇撴瀯鍙互緇欎唬鐮佺殑榪愯鏁堢巼甯︽潵闈炲父澶х殑鎻愬崌銆傛瘮濡傜粰瀹歂FA鏌愪釜鐘舵侊紝闇瑕佹壘鍑烘墍鏈変粠榪欎釜鐘舵佸嚭鍙戠殑杈癸紝涔嬪墠浣跨敤鐨勬槸map緇撴瀯鏉ヤ繚瀛樹粠鏌愪釜鐘舵佸嚭鍙戣竟鐨剉ector錛屼箣鍚庡彂鐜伴亶鍘嗙殑閫熷害闈炲父緙撴參錛屽湪鎹㈡垚hashmap涔嬪悗錛岄熷害鏈夋樉钁楃殑鎻愬崌銆傚簲姝ゅ湪瀹為檯緙栫▼榪囩▼涓紝閫夌敤涓涓悎閫傜殑鏁版嵁緇撴瀯鏄懼緱灝や負閲嶈銆?

 

鍦ㄤ嬌鐢ㄧ嚎鎬х粨鏋勬椂錛屼竴鑸湪灝忔暟鎹噺鎴栦笉騫沖嚒鎻掑叆鎴栧垹闄ゆ暟鎹殑鎯呭喌涓嬶紝閫夌敤vector浣滀負瀹瑰櫒浼氭洿蹇竴浜涖傝屽湪闇瑕佸鉤鍑℃彃鍏ユ垨鍒犻櫎鏁版嵁鐨勫満鍚堜笅錛岄夌敤list浣滀負瀹瑰櫒浼氭湁鏇翠紭寮傜殑緇撴灉銆傞渶瑕佷繚鎸佸厓绱犲敮涓鎬х殑鎯呭喌涓嬶紝鎴戜細浼樺厛閫夌敤set浣滀負瀹瑰櫒錛岃屽湪鏁版嵁閲忛潪甯稿ぇ鐨勬儏鍐典笅錛屽氨浼氫嬌鐢╤ashset鏉ヤ唬鏇縮et銆俶ap鍒欏瀹冪殑鍚嶅瓧閭f牱錛岄傜敤浜巏ey-value鐨勫満鍚堬紝鑰宧ashmap鍦ㄦ暟鎹噺闈炲父澶х殑鎯呭喌涓嬩嬌鐢ㄣ?

綆楁硶

 

min鍜宮ax鍑芥暟鍒嗗埆鐢ㄤ簬姹傚彇鏈灝忓煎拰鏈澶у鹼紝fill_n鐢ㄦ潵濉厖鑻ュ共涓璞$殑鍊箋俢opy_backward鐢ㄦ潵浠庡悗寰鍓嶆嫹璐濆箋俤istance鐢ㄦ潵姹傜粰瀹氬尯闂碵first, last)鐨勯暱搴︺俿earch鐢ㄤ簬鍦ㄧ粰瀹氳寖鍥碵first1, last1)鍐呮煡鎵劇鍚堝簭鍒梉first2, last2)闆嗗悎鐨勫箋俿wap鍜宨terator_swap鍒嗗埆鐢ㄤ簬浜ゆ崲涓や釜鍊煎拰涓や釜榪唬鍣ㄦ寚鍚戠殑鍊箋俿ort鐢ㄤ簬灝嗘寚瀹氳寖鍥碵first, last)鍐呯殑鍊兼帓搴忥紝find鐢ㄤ簬鍦ㄦ寚瀹氳寖鍥碵first, last)鍐呮煡鎵炬寚瀹氱殑鍊箋倀oArray鐢ㄤ簬灝嗘寚瀹氳寖鍥碵first, last)鍐呯殑鍊艱漿鎹負鍐呭瓨榪炵畫鐨勬暟緇勶紝compareArray鍒欑敤浜庢瘮杈冧袱涓暟緇勫唴鐨勫肩殑涓暟鍜屽兼槸鍚︾浉鍚屻?

 

鍏蜂綋鐨勫疄鐜頒唬鐮侊紝浣犲彲浠ュ湪QCore/Library/algo.h涓壘鍒般?

姝e垯

 

閫氳繃閲嶈澆+錛堢浉鍔狅級銆?銆亅銆?錛堝墠緗級銆?(鍓嶇疆錛夈?浠ュ強opt鍑芥暟鏉ョ敓鎴愭鍒欒〃杈懼紡鐨?#949;-NFA錛岀劧鍚庨氳繃buildDFA鍑芥暟鐢熸垚DFA銆傞氳繃parse鍜宮atch鍙垎鏋愮粰瀹氱殑瀛楃涓叉槸鍚︾鍚堣繖涓鍒欒〃杈懼紡錛宲arse浠庡ご寮濮嬭窇DFA鐪嬭繖涓瓧絎︿覆鐨勫紑澶存槸鍚︽湁絎﹀悎榪欎釜姝e垯琛ㄨ揪寮忕殑瀛楃涓詫紝鑰宮atch鍒欎細鎵綶first, last)鍖洪棿鍐呯鍚堣繖涓鍒欒〃杈懼紡鐨勭涓涓瓧絎︿覆鐨勭浉鍏崇粨鏋溿?

 

鍏蜂綋鐨勫疄鐜版柟娉曪紝浣犲彲浠ョ湅http://www.shnenglu.com/lwch/archive/2013/02/15/197848.html鍜?a href="http://www.shnenglu.com/lwch/archive/2013/02/23/198043.html">http://www.shnenglu.com/lwch/archive/2013/02/23/198043.html涓ょ瘒鏂囩珷錛岃屼唬鐮佸垯鍙湪QCore/Library/regex/regex.h涓壘鍒般?

IO

 

IO妯″潡鍖呭惈鏂囦歡IO鍜屾爣鍑嗚緭鍏ヨ緭鍑篒O錛岄鍏堟湁涓や釜鍩虹被鍒嗗埆鏄痓asic_istream鍜宐asic_ostream鍒嗗埆浣滀負杈撳叆鍜岃緭鍑簊tream鐨勫熀綾?鍏朵腑鍒嗗埆瀹氫箟浜嗚繍綆楃>>鍜?lt;<錛岄氳繃榪欎袱涓繍綆楃鍙互鐩磋鐨勭湅鍒版槸浠巗tream杈撳嚭鍒板彉閲忔垨鏄粠鍙橀噺杈撳叆鍒皊tream涓備箣鍚庢湁stdstream_basic鍜宖stream_basic閮界戶鎵胯嚜basic_istream鍜宐asic_ostream鍒嗗埆浣滀負basic_stdstream鍜宐asic_fstream鐨勫熀綾伙紝瀹冧滑閮芥湁open銆乻ize銆乼ell銆乻eek銆乺ead銆亀rite鍜宖lush鏂規硶錛屽畠浠兘鏄搴曞眰C鍑芥暟鐨勪竴浜涘皝瑁呫傝屽湪涓嬩竴灞傜殑basic_stdstream鍜宐asic_fstream涓垯瀹炵幇浜嗚繍綆楃>>鍜?lt;<鐨勬墍鏈夐噸杞斤紝榪欐牱鍋氱殑濂藉鏄彲浠ヤ嬌浠g爜鏇存湁鏉$悊鎬э紝騫舵柟渚塊槄璇匯?

 

瀵逛簬鏍囧噯杈撳叆杈撳嚭嫻佹潵璇達紝瀹為檯涓婃槸瀵箂tdin銆乻tdout銆乻tderr鐨勪竴浜涘皝瑁咃紝褰撶劧閲岄潰涔熸湁涓浜涙瘮杈冪壒孌婄殑鎺ュ彛錛屾瘮濡俿etColor錛堢敤浜庤緗緭鍏ヨ緭鍑烘祦鐨勫瓧浣撻鑹詫級浠ュ強涓浜涢鑹茬浉鍏崇殑鍑芥暟銆?

 

瀵逛簬fstream鏉ヨ瀹冩槸閽堝鎵鏈夋枃浠剁殑錛屽簲姝ゅ畠浼氬涓涓猺eadAll鎺ュ彛鐢ㄤ簬涓嬈℃х殑璇誨嚭榪欎釜鏂囦歡鐨勬墍鏈夊唴瀹癸紝涓轟簡鑺傜渷棰戠箒璇誨啓紓佺洏鎵閫犳垚鐨勬ц兘鎹熻楋紝鎴戜滑緇欏畠瀹氫箟浜嗕袱涓猙uffer鐢ㄦ潵鍋歝ache錛屽綋浣犺鍐欏叆鏂囦歡鏃訛紝瀹冨茍涓嶆槸椹笂灝辯洿鎺ュ線紓佺洏閲屽啓鐨勶紝鑰屼細鍔犲埌buffer褰撲腑錛屽綋杈懼埌涓涓鍊兼椂鎵嶇湡姝g殑鍐欏叆鍒扮鐩樸?

閭d箞IO妯″潡灝卞厛浠嬬粛鍒拌繖閲屼簡錛屽畠浠殑浠g爜浣犲彲浠ュ湪QCore/Library/ios.h銆?a href="../Source/QCore/Library/istream.h">QCore/Library/istream.h銆?a href="../Source/QCore/Library/ostream.h">QCore/Library/ostream.h銆?a href="../Source/QCore/Library/fstream.h">QCore/Library/fstream.h銆?a href="../Source/QCore/Library/stdstream.h">QCore/Library/stdstream.h銆?a href="../Source/QCore/Library/iostream.h">QCore/Library/iostream.h鍜?a href="../Source/QCore/Library/iostream.cpp">QCore/Library/iostream.cpp涓壘鍒般?

緇撴潫

 

涓婃枃浠嬬粛浜嗗ぇ閮ㄥ垎妯″潡鐨勫疄鐜拌繃紼嬩笌瀹炵幇榪囩▼涓殑蹇冨緱錛岃鎴戜滑鏉ユ寜鐓ч『搴忓洖欏句竴涓嬨?

 

棣栧厛浠嬬粛浜嗗唴瀛樻睜鐨勫疄鐜拌繃紼嬶紝浠ュ強鍦ㄥ疄鐜拌繃紼嬩腑閬囧埌鐨勪竴浜涢棶棰橈紝姣斿濡備綍媯嫻嬪唴瀛樻硠婕忋佸浣曡幏鍙栬皟鐢ㄥ爢鏍堢瓑銆?

 

鐒跺悗浠嬬粛浜唗raits鎶鏈紝瀹冩槸鐢ㄦ潵钀冨彇鍑轟竴浜涚壒鎬х敤鐨勶紝閫氳繃traits鎶鏈綘鍙互寰楀埌涓涓被鍨嬫槸鍚︿負POD鏄惁鏈夐粯璁ゆ瀯閫犲嚱鏁扮瓑鐗規с傝宊_container_traits鍒欒悆鍙栧嚭浜嗗鍣ㄧ殑涓浜涚壒鎬э紝姣斿鍊肩被鍨嬬瓑絳夈傞氳繃char_traits鎴戜滑寰楀埌浜嗕竴浜涘叧浜庡瓧絎︿覆鐨勬搷浣滐紝姣斿姹傚瓧絎︿覆鐨勯暱搴︾瓑銆?

 

涔嬪悗鍙堥氳繃鐗逛緥鍖栵紝鎴戜滑瀹炵幇浜嗕竴縐嶆瘮杈冧袱涓彉閲忕被鍨嬫槸鍚︾浉鍚岀殑鎵嬫銆?

 

鎺ヤ笅鏉ユ垜浠粙緇嶄簡榪唬鍣ㄥ拰鍙嶅悜榪唬鍣紝瀹冧滑鏄竴縐嶇被浼間簬smart pointer鐨勪笢瑗匡紝鎴戜滑鍙互閫氳繃涓涓猍first, last]鍓嶉棴鍚庡紑鍖洪棿鏉ヨ〃紺轟竴涓鍣ㄥ唴鐨勬墍鏈夊厓绱犮傜劧鍚庢垜浠氳繃iterator_traits钀冨彇鍑轟簡榪唬鍣ㄧ殑涓浜涚壒鎬э紝姣斿鍊肩被鍨嬬瓑銆?

 

鏈鍚庢垜浠粙緇嶄簡鎵鏈夋瘮杈冨父鐢ㄧ殑瀹瑰櫒錛屼互鍙婂湪鏌愪簺鍦哄悎涓嬪簲璇ヤ嬌鐢ㄥ摢縐嶅鍣ㄦ潵杈懼埌楂樻晥鐨勭洰鐨勩傛瘮濡傚湪鏁版嵁閲忚緝澶ф椂浣跨敤hashset瑕佹瘮浣跨敤set鍦ㄦ彃鍏ュ拰鏌ユ壘閫熷害瑕佹洿蹇竴浜涳紝鑰屼笖鏃墮棿璐熻矗搴︽洿紼沖畾涓浜涖?

 

涔嬪悗鎴戜滑鍙堜粙緇嶄簡涓浜涘父鐢ㄧ畻娉曪紝閫氳繃榪欎簺綆楁硶瓚充互瑙e喅涓浜涚畝鍗曠殑闂銆傛瘮濡傛帓搴忓拰姹傚彇涓涓寖鍥碵first, last]鐨勯暱搴︾瓑銆?

 

鍦ㄦ鍒欒繖涓绔犱腑錛屼粙緇嶄簡鎴戜滑鏄浣曢氳繃涓浜涜繍綆楃鐨勯噸杞芥潵鏋勯犲嚭鏌愪釜姝e垯琛ㄨ揪寮忕殑鐘舵佹満鐨勶紝浠ュ強濡備綍閫氳繃榪愯榪欎簺鐘舵佹満鏉ュ垎鏋愮粰瀹氱殑瀛楃涓層?

 

鏈鍚庝粙緇嶄簡IO妯″潡錛屽叾涓垎涓烘爣鍑嗚緭鍏ヨ緭鍑烘祦鍜屾枃浠舵祦錛岄氳繃閲嶈澆<<鍜?gt;>榪愮畻絎︼紝鍙互鐩磋鐨勭湅鍒版槸浠庢祦涓鍐呭杈撳叆鍒頒竴涓彉閲忔垨鏄粠涓涓彉閲忎腑璁插唴瀹硅緭鍏ュ埌嫻佷腑銆?

 

甯屾湜閫氳繃鏈枃鍙嬌璇昏呬綋浼氬埌浣滆呭湪璁捐榪欎釜搴撶殑鏃跺欐墍鑰冭檻鐨勯棶棰橈紝浠ュ強瀵硅繖涓簱鏈変竴涓ぇ姒傜殑璁よ瘑錛岀◢鍚庢垜浼氬湪鎴戠殑鍗氬涓ˉ榻愭墍鏈夋病鏈変粙緇嶈繃鐨勬ā鍧楁槸濡備綍瀹炵幇鐨勩?

淇敼璁板綍

 

2013.4.23絎竴嬈$紪鍐?

2013.4.24娣誨姞瀹瑰櫒鐨勮鏄?

2013.4.25娣誨姞hashtable銆乭ashset銆乭ashmap鍜宐asic_string緇撴瀯鐨勮鏄?

2013.4.28娣誨姞綆楁硶鍜屾鍒欑殑璇存槑

2013.4.30娣誨姞IO鐨勮鏄庯紝瀹岀粨姝ゆ枃



lwch 2013-04-30 20:24 鍙戣〃璇勮
]]>
灞卞STL瀹炵幇涔嬪唴瀛樻睜V2http://www.shnenglu.com/lwch/archive/2013/01/19/197415.htmllwchlwchSat, 19 Jan 2013 12:09:00 GMThttp://www.shnenglu.com/lwch/archive/2013/01/19/197415.htmlhttp://www.shnenglu.com/lwch/comments/197415.htmlhttp://www.shnenglu.com/lwch/archive/2013/01/19/197415.html#Feedback0http://www.shnenglu.com/lwch/comments/commentRss/197415.htmlhttp://www.shnenglu.com/lwch/services/trackbacks/197415.html涓婁竴綃囦腑鎴戜滑宸茬粡瀹炵幇浜嗕竴涓畝鍗曠殑鍐呭瓨姹狅紝鍙互鐢寵鏇村ぇ鍧楃殑鍐呭瓨鍧楁潵鍑忓皯鐢寵灝忓潡鍐呭瓨鍧楁椂浜х敓鐨勫唴瀛樼鐗囥?br />
鍦ㄦ湰綃囦腑錛屾垜浠渶瑕佷負鍏跺姞鍏ュ唴瀛樻硠婕忕殑媯嫻嬩唬鐮侊紝浠ユ鏉ユ嫻嬩唬鐮佺紪鍐欒繃紼嬩腑鐨勭枏蹇藉甫鏉ョ殑鍐呭瓨娉勬紡銆傦紙callstack鐨勬樉紺烘殏鏃朵粎鏀寔Windows錛?br />
涓銆佸唴瀛樻硠婕忔嫻?/strong>
棣栧厛錛屾敼鍐檕bj鍜宐lock緇撴瀯錛屽湪obj涓姞鍏ヤ竴涓煙released琛ㄧず榪欎釜chunk鏄惁琚噴鏀?br />
 1     struct obj
 2     {
 3 #ifdef _DEBUG
 4         bool      released;
 5 
 6 #if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) // Only windows can get callstack
 7 #define CALLSTACK_MAX_DEPTH 30
 8         UINT_PTR  callStack[CALLSTACK_MAX_DEPTH];
 9         DWORD     dwCallStackDepth; // Real depth
10 #endif
11 
12 #endif
13         obj*      next;
14     };
15 
16     struct block
17     {
18         block*    next;
19         void*     data;
20 #ifdef _DEBUG
21         size_type size;
22 #if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
23         UINT_PTR  callStack[CALLSTACK_MAX_DEPTH];
24         DWORD     dwCallStackDepth;
25 #endif
26 #endif
27     };
鍏朵腑鐨刢allstack閮ㄥ垎灝嗗湪涓嬩竴鑺備腑浠嬬粛

鐒跺悗錛屾垜浠鍔犱竴涓粨鏋?br />
1 #ifdef _DEBUG
2     struct use
3     {
4         obj* data;
5         use* next;
6     };
7 #endif
鍏朵腑data鍩熸寚鍚戜簡涓鍧楀垎閰嶅嚭鍘葷殑灝忓唴瀛樺潡錛宯ext鍩熷艦鎴愪簡涓寮犻摼琛ㄣ?br />
鐒跺悗錛屾垜浠坊鍔犱竴涓垚鍛樺彉閲忔潵淇濆瓨榪欏紶閾捐〃錛屼互鍙婁竴涓嚱鏁版潵灝嗕竴涓猚hunk鎻掑叆榪欏紶閾捐〃
#ifdef _DEBUG
    use*      use_list;
#endif

#ifdef _DEBUG
inline void MemoryPool::addUseInfo(obj* ptr)
{
    use* p = (use*)malloc(sizeof(use));
    p->data = ptr;
    p->next = use_list;
    use_list = p;
}
#endif

鐒跺悗錛屾垜浠潵鏀瑰啓refill鍑芥暟浣垮叾鍦ㄥ垎閰嶅唴瀛樺潡鏃舵墦涓妑eleased鏍囪錛屽茍灝嗘瘡涓垎閰嶇殑鍐呭瓨鍧楄褰曚笅鏉?br />
 1 void* MemoryPool::refill(int i, void(*h)(size_type))
 2 {
 3     const int count = 20;
 4     const int preSize = (i + 1) * ALIGN + headerSize;
 5     char* p = (char*)malloc(preSize * count);
 6     while(p == 0)
 7     {
 8         h(preSize * count);
 9         p = (char*)malloc(preSize * count);
10     }
11     block* pBlock = (block*)malloc(sizeof(block));
12     while(pBlock == 0)
13     {
14         h(sizeof(block));
15         pBlock = (block*)malloc(sizeof(block));
16     }
17     pBlock->data = p;
18     pBlock->next = free_list;
19     free_list = pBlock;
20 
21     obj* current = (obj*)p;
22 #ifdef _DEBUG
23     addUseInfo(current);
24     current->released = false;
25 #endif
26     current = (obj*)((char*)current + preSize);
27     for(int j = 0; j < count - 1; ++j)
28     {
29 #ifdef _DEBUG
30         addUseInfo(current);
31         current->released = true;
32 #endif
33         current->next = chunk_list[i];
34         chunk_list[i] = current;
35         current = (obj*)((char*)current + preSize);
36     }
37     return (char*)p + headerSize;
38 }
鍏朵腑鐨刪eaderSize璺焎allstack鏈夊叧錛屽皢鍦ㄤ笅涓鑺備腑浠嬬粛銆?br />
褰撶劧錛屽湪deallocate鏃惰灝嗘鍐呭瓨鍧楃殑released鏍囪鎵撲負true
 1 void MemoryPool::deallocate(void* p, size_type n)
 2 {
 3     if(p == 0) return;
 4     if(n > MAX_BYTES)
 5     {
 6         free(p);
 7         return;
 8     }
 9     const int i = INDEX(ROUND_UP(n));
10 #ifdef _DEBUG
11     p = (char*)p - (int)headerSize;
12     obj* ptr = reinterpret_cast<obj*>(p);
13     if (ptr->released) throw error<char*>("chunk has already released", __FILE__, __LINE__);
14     ptr->released = true;
15 #endif
16     reinterpret_cast<obj*>(p)->next = chunk_list[i];
17     chunk_list[i] = reinterpret_cast<obj*>(p);
18 }

OK錛岀幇鍦ㄥ凡緇忔湁妯℃湁鏍蜂簡錛屽彲浠ユ澗鍙f皵浜嗐傛帴涓嬫潵鏄渶閲嶈鐨勯儴鍒嗭紝鍦∕emoryPool鏋愭瀯鏃舵嫻嬭繖涓狿ool鍐呯殑use_list涓槸鍚︽湁chunk鐨剅eleased鏍囪涓簍rue錛堝唴瀛樻硠婕忎簡錛?br />
 1 MemoryPool::~MemoryPool()
 2 {
 3 #ifdef _DEBUG
 4     while (use_list)
 5     {
 6         use *ptr = use_list, *next = use_list->next;
 7         if (!ptr->data->released)
 8         {
 9             obj* pObj = ptr->data;
10             Console::SetColor(truefalsefalsetrue);
11             throw error<char*>("chunk leaked", __FILE__, __LINE__);
12         }
13         free(ptr);
14         use_list = next;
15     }
16 #endif
17     clear();
18 }
鍏跺疄璇存潵涔熷鏄擄紝鍙渶瑕佹嫻嬫瘡涓猚hunk鐨剅eleased鏍囪鏄惁涓簍rue灝辮浜嗭紝鑰屾渶鍚庣殑clear鍑芥暟鏄互鍓嶆瀽鏋勫嚱鏁扮殑浠g爜錛岀敤鏉ラ噴鏀炬墍鏈夌敵璇風殑block鍜屽ぇ鍧楃殑chunk銆?br />
OK錛岀幇鍦ㄦ垜浠凡緇忓彲浠ユ嫻嬪嚭娌℃湁琚玠eallocate鐨刢hunk浜嗐?br />
浜屻乧allstack
棣栧厛錛屾垜浠厛鏉ョ湅涓涓猈indows API錛?#8220;CaptureStackBackTrace”榪欎釜API閫氳繃浼犲叆鐨勪竴涓暟緇勬潵寰楀埌涓緇勫湴鍧銆傚綋鐒舵湁榪欎釜API騫朵笉澶燂紝鎴戜滑榪橀渶瑕佺煡閬撴槸鍝釜鏂囦歡鐨勭鍑犺銆?#8220;SymGetSymFromAddr64”榪欎釜API鐢ㄦ潵鑾峰彇鏌愪釜鍦板潃瀵瑰簲鐨勫嚱鏁板悕錛?#8220;SymGetLineFromAddr64”榪欎釜API鍒欐槸鐢ㄦ潵鑾峰彇鏌愪釜鍦板潃瀵瑰簲鐨勬枃浠跺悕鍜岃鍙風殑錛岃繖涓や釜鍑芥暟鐨?2浣嶇増鏈垯鏄笉甯?4鐨勩傛湁浜嗚繖浜沇indows API錛屾垜浠氨鍙互寰堣交鏉劇殑鑾峰彇鍒板綋鍓嶅嚱鏁扮殑璋冪敤鍫嗘爤浜嗭紝涓昏鐨勫姛鍔寵繕鏄褰掑姛浜嶹indows寮哄ぇ鐨刣bghelp銆?br />
鏈鍚庯紝瀹屾暣鐨勪唬鐮佷綘鍙互鍦?a target="_blank">http://code.google.com/p/qlanguage/涓壘鍒般?img src ="http://www.shnenglu.com/lwch/aggbug/197415.html" width = "1" height = "1" />

lwch 2013-01-19 20:09 鍙戣〃璇勮
]]>
濡備綍姣旇緝涓や釜鍙橀噺鐨勭被鍨嬫槸鍚︾浉鍚?/title><link>http://www.shnenglu.com/lwch/archive/2012/08/25/188253.html</link><dc:creator>lwch</dc:creator><author>lwch</author><pubDate>Sat, 25 Aug 2012 08:13:00 GMT</pubDate><guid>http://www.shnenglu.com/lwch/archive/2012/08/25/188253.html</guid><wfw:comment>http://www.shnenglu.com/lwch/comments/188253.html</wfw:comment><comments>http://www.shnenglu.com/lwch/archive/2012/08/25/188253.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/lwch/comments/commentRss/188253.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/lwch/services/trackbacks/188253.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->        template <typename T1, typename T2><br />         inline <span style="color: #0000FF; ">const</span> <span style="color: #0000FF; ">bool</span> compare_type(T1, T2)<br />         {<br />             <span style="color: #0000FF; ">return</span> <span style="color: #0000FF; ">false</span>;<br />         }<br /> <br />         template <><br />         inline <span style="color: #0000FF; ">const</span> <span style="color: #0000FF; ">bool</span> compare_type(<span style="color: #0000FF; ">int</span>, <span style="color: #0000FF; ">int</span>)<br />         {<br />             <span style="color: #0000FF; ">return</span> <span style="color: #0000FF; ">true</span>;<br />         }<br /> <br />         template <><br />         inline <span style="color: #0000FF; ">const</span> <span style="color: #0000FF; ">bool</span> compare_type(<span style="color: #0000FF; ">float</span>, <span style="color: #0000FF; ">float</span>)<br />         {<br />             <span style="color: #0000FF; ">return</span> <span style="color: #0000FF; ">true</span>;<br />         }<br /> <br />         template <><br />         inline <span style="color: #0000FF; ">const</span> <span style="color: #0000FF; ">bool</span> compare_type(<span style="color: #0000FF; ">double</span>, <span style="color: #0000FF; ">double</span>)<br />         {<br />             <span style="color: #0000FF; ">return</span> <span style="color: #0000FF; ">true</span>;<br />         }<br /> <br />         template <><br />         inline <span style="color: #0000FF; ">const</span> <span style="color: #0000FF; ">bool</span> compare_type(<span style="color: #0000FF; ">char</span>, <span style="color: #0000FF; ">char</span>)<br />         {<br />             <span style="color: #0000FF; ">return</span> <span style="color: #0000FF; ">true</span>;<br />         }<br /> <br />         template <><br />         inline <span style="color: #0000FF; ">const</span> <span style="color: #0000FF; ">bool</span> compare_type(wchar_t, wchar_t)<br />         {<br />             <span style="color: #0000FF; ">return</span> <span style="color: #0000FF; ">true</span>;<br />         }<br /> <br />         template <typename T1, typename T2><br />         inline <span style="color: #0000FF; ">const</span> <span style="color: #0000FF; ">bool</span> compare_type(T1*, T2*)<br />         {<br />             <span style="color: #0000FF; ">return</span> compare_type(T1(), T2());<br />         }<br /> <br />         template <typename T1, typename T2><br />         inline <span style="color: #0000FF; ">const</span> <span style="color: #0000FF; ">bool</span> compare_type(<span style="color: #0000FF; ">const</span> T1*, <span style="color: #0000FF; ">const</span> T2*)<br />         {<br />             <span style="color: #0000FF; ">return</span> compare_type(T1(), T2());<br />         }<br /> <br />         template <typename T1, typename T2><br />         inline <span style="color: #0000FF; ">const</span> <span style="color: #0000FF; ">bool</span> compare_type(<span style="color: #0000FF; ">const</span> T1*, T2*)<br />         {<br />             <span style="color: #0000FF; ">return</span> <span style="color: #0000FF; ">false</span>;<br />         }<br /> <br />         template <typename T1, typename T2><br />         inline <span style="color: #0000FF; ">const</span> <span style="color: #0000FF; ">bool</span> compare_type(T1*, <span style="color: #0000FF; ">const</span> T2*)<br />         {<br />             <span style="color: #0000FF; ">return</span> <span style="color: #0000FF; ">false</span>;<br />         }</div> 閫氳繃鐗逛緥鍖栵紝鎴戜滑鍙互寰堣交鏉劇殑鏌ョ湅涓や釜鍙橀噺鐨勭被鍨嬫槸鍚︾浉鍚屻?img src ="http://www.shnenglu.com/lwch/aggbug/188253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/lwch/" target="_blank">lwch</a> 2012-08-25 16:13 <a href="http://www.shnenglu.com/lwch/archive/2012/08/25/188253.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>灞卞STL瀹炵幇涔媗isthttp://www.shnenglu.com/lwch/archive/2012/08/09/186770.htmllwchlwchThu, 09 Aug 2012 13:17:00 GMThttp://www.shnenglu.com/lwch/archive/2012/08/09/186770.htmlhttp://www.shnenglu.com/lwch/comments/186770.htmlhttp://www.shnenglu.com/lwch/archive/2012/08/09/186770.html#Feedback0http://www.shnenglu.com/lwch/comments/commentRss/186770.htmlhttp://www.shnenglu.com/lwch/services/trackbacks/186770.html
鍥犱負鏄弻鍚戦摼琛ㄧ殑鍏崇郴錛岄偅涔堝繀鐒舵湁涓縐嶇粨鏋勬潵琛ㄧず閾捐〃涓殑鑺傜偣銆?br />
        template <typename T>
        struct __list_node
        {
            __list_node<T>* prev;
            __list_node<T>* next;
            T data;

            __list_node() : prev(NULL), next(NULL)
            {
            }

            __list_node(const T& x) : prev(NULL), next(NULL), data(x)
            {
            }
        };

鐒跺悗鎴戜滑瀹氫箟鍑哄叾iterator鍜宑onst_iterator鐨勭粨鏋?br />
        template <typename T>
        struct __list_iterator
        {
            typedef __list_iterator<T> iterator;
            typedef T                  value_type;
            typedef ptrdiff_t          difference_type;
            typedef T*                 pointer;
            typedef T&                 reference;
            typedef const T*           const_pointer;
            typedef const T&           const_reference;
            typedef __list_node<T>*    link_type;
            typedef void*              void_pointer;

            link_type node;

            __list_iterator(link_type x) : node(x)
            {
            }

            __list_iterator(const __list_const_iterator<T>& x) : node(x.node)
            {
            }

            __list_iterator() : node(NULL)
            {
            }

            inline iterator& operator++()
            {
                node = ((link_type)node)->next;
                return *this;
            }

            inline iterator operator++(int)
            {
                iterator tmp = *this;
                ++*this;
                return tmp;
            }

            inline iterator& operator--()
            {
                node = ((link_type)node)->prev;
                return *this;
            }

            inline iterator operator--(int)
            {
                iterator tmp = *this;
                --*this;
                return tmp;
            }

            inline reference operator*()const
            {
                return node->data;
            }

            inline bool operator==(const iterator& x)const
            {
                return node == x.node;
            }

            inline bool operator!=(const iterator& x)const
            {
                return node != x.node;
            }
        };
鐢變簬const_iterator涓巌terator鐨勭粨鏋勭被浼鹼紝榪欓噷涓嶅啀璐村嚭銆傚叾涓噸杞戒簡++涓?-榪愮畻絎︼紝瀹為檯涓婂氨鏄妭鐐圭殑鍓嶅悗縐誨姩銆?br />
鐒跺悗鐪嬩竴涓媗ist鐨勫畾涔?br />
        template <typename T>
        class list
        {
        }

璁╂垜浠潵鐪嬬湅list涓殑鍒悕
        public:
            typedef T                        value_type;
            typedef T*                       pointer;
            typedef __list_iterator<T>       iterator;
            typedef __list_const_iterator<T> const_iterator;
            typedef T&                       reference;
            typedef const T&                 const_reference;
            typedef size_t                   size_type;
            typedef ptrdiff_t                difference_type;
            typedef reverse_iterator<const_iterator, value_type, size_type, difference_type> const_reverse_iterator;
            typedef reverse_iterator<iterator, value_type, size_type, difference_type> reverse_iterator;

涓嬮潰鏄叾鍐呴儴鐨勬垚鍛樺彉閲?br />
        protected:
            typedef __list_node<T>*           link_type;
            typedef list<T>                   self;
            typedef allocator<__list_node<T> > Node_Alloc;

            link_type node;
            size_type length;
鍦⊿TL涓粠begin鍒癳nd鎬繪槸浠ヤ竴涓墠闂悗寮鐨勫艦寮忔潵琛ㄧず鐨勶紝搴旀鎴戜滑緇欏嚭涓涓猲ode鑺傜偣鏉ヨ〃紺篹nd鎵鎸囦綅緗紝鑰宯ode鑺傜偣鐨勫墠椹卞垯鏄繖涓猯ist鐨勮搗濮嬭妭鐐癸紝鑰宭ength鍒欏瓨鍌ㄤ簡榪欎釜list鐨勫厓绱犳暟閲忋?br />
涓嬮潰鏉ョ湅鐪媗ist涓渶鍩烘湰鐨勬瀯閫犲嚱鏁板拰鏋愭瀯鍑芥暟
            list() : length(0)
            {
                node = Node_Alloc::allocate();
                node->next = node;
                node->prev = node;
            }

            ~list()
            {
                clear();
                Node_Alloc::deallocate(node);
            }
鍦╨ist瀵硅薄鏋勯犱箣鍒濓紝棣栧厛鏋勯犲嚭node鑺傜偣錛屼嬌鍏剁殑鍓嶉┍鍜屽悗緇ч兘鎸囧悜鍏舵湰韜紝搴旀閫氳繃begin鍜宔nd鎷垮嚭鐨勮凱浠e櫒涓哄悓涓涓傚湪list瀵硅薄鏋愭瀯鏃訛紝棣栧厛灝嗚繖涓猯ist娓呯┖錛岀劧鍚庡皢鏋勯犲嚭鐨刵ode鑺傜偣閲婃斁鎺夈?br />
鐒跺悗鏄叾begin鍜宔nd鏂規硶錛岀敤鏉ヨ幏鍙栫涓涓厓绱犲拰鏈鍚庝竴涓厓绱犵殑鍚庝竴涓厓绱犵殑榪唬鍣?br />
            inline iterator begin()
            {
                return node->next;
            }

            inline const_iterator begin()const
            {
                return node->next;
            }

            inline iterator end()
            {
                return node;
            }

            inline const_iterator end()const
            {
                return node;
            }

front鍜宐ack鍒嗗埆琚敤鏉ヨ幏鍙栫涓涓厓绱犲拰鏈鍚庝竴涓厓绱?br />
            inline reference front()
            {
                return *begin();
            }

            inline const_reference front()const
            {
                return *begin();
            }

            inline reference back()
            {
                return *end();
            }

            inline const_reference back()const
            {
                return *end();
            }

empty銆乻ize鍒嗗埆琚敤鏉ュ垽鍒鍣ㄦ槸鍚︿負絀恒佽幏鍙栧鍣ㄥ唴鍏冪礌鐨勪釜鏁?br />
            inline bool empty()const
            {
                return length == 0;
            }

            inline size_type size()const
            {
                return length;
            }

list涓巚ector涓嶅悓鐨勬槸list鏄弻鍚戠殑錛屽簲姝ゅ畠鍏佽浠庡ご灝句袱涓柟鍚戞潵鎻掑叆鍜屽垹闄ゅ厓绱?br />
            inline void push_front(const T& x)
            {
                insert(begin(), x);
            }

            inline void push_back(const T& x)
            {
                insert(end(), x);
            }

            inline void pop_front()
            {
                erase(begin());
            }

            inline void pop_back()
            {
                erase(--end());
            }

鐒跺悗鎴戜滑鏉ョ湅涓涓媝ush鐨勬湰璐紝insert鍑芥暟
            iterator insert(const iterator& position, const T& x)
            {
                if(!inRange(position)) throw "out of range";
                link_type tmp = Node_Alloc::allocate();
                construct(tmp, x);
                tmp->prev = position.node->prev;
                tmp->next = position.node;
                position.node->prev->next = tmp;
                position.node->prev = tmp;
                ++length;
                return tmp;
            }
榪欓噷棣栧厛浼氭鏌ヨ繖涓凱浠e櫒鏄惁灞炰簬榪欎釜list錛岀劧鍚庢瀯閫犲嚭涓涓柊鑺傜偣錛屽茍鎶婂畠鎻掑叆鍒拌繖涓凱浠e櫒鐨勫墠闈紝鏈鍚庡皢鑺傜偣鏁?1銆?br />
鐒跺悗鏄叾鍒犻櫎鑺傜偣鍑芥暟erase
            void erase(const iterator& position)
            {
                if(!inRange(position)) throw "out of range";
                position.node->prev->next = position.node->next;
                position.node->next->prev = position.node->prev;
                destruct(&position.node->data, has_destruct(position.node->data));
                Node_Alloc::deallocate(position.node);
                --length;
            }
榪欓噷鍚屾牱浼氭鏌ヨ繖涓凱浠e櫒鏄惁灞炰簬榪欎釜list錛岀劧鍚庡皢榪欎釜鑺傜偣縐婚櫎錛屾渶鍚庢瀽鏋勫茍閲婃斁鍐呭瓨絀洪棿銆?br />
鏈鍚庤鎴戜滑鏉ョ湅涓涓媗ist涓噸杞界殑榪愮畻絎?br />
            self& operator=(const self& x)
            {
                if(this == &x) return *this;

                iterator first1 = begin();
                iterator last1 = end();
                const_iterator first2 = x.begin();
                const_iterator last2 = x.end();
                while (first1 != last1 && first2 != last2) *first1++ = *first2++;
                if (first2 == last2) erase(first1, last1);
                else insert(last1, first2, last2);
                return *this;
            }

            reference operator[](size_type n)
            {
                if(n < 0 || n >= length) throw "out of range";
                link_type current = NULL;
                if(n < length / 2)
                {
                    current = node->next;
                    for(size_type i = 0; i < n; i++, current = current->next);
                }
                else
                {
                    n = length - n - 1;
                    current = node->prev;
                    for(size_type i = 0; i < n; i++, current = current->prev);
                }
                return current->data;
            }

            inline value_type at(size_type n)
            {
                return operator[](n);
            }
鍥犱負鍏跺唴閮ㄤ嬌鐢ㄧ殑鏄弻鍚戦摼琛紝搴旀閫氳繃鎸囧畾涓嬫爣鏉ヨ幏鍙栬繖涓厓绱犳槸鍙垎鍒粠涓ゅご榪涜縐誨姩鎸囬拡銆?br />
鑷蟲錛宭ist鐨勮瑙e凡瀹屾垚錛屽畬鏁翠唬鐮佽鍒?a target="_blank">http://qlanguage.codeplex.com涓嬭澆

lwch 2012-08-09 21:17 鍙戣〃璇勮
]]>
灞卞STL瀹炵幇涔嬪唴瀛樻睜http://www.shnenglu.com/lwch/archive/2012/07/14/183420.htmllwchlwchSat, 14 Jul 2012 10:40:00 GMThttp://www.shnenglu.com/lwch/archive/2012/07/14/183420.htmlhttp://www.shnenglu.com/lwch/comments/183420.htmlhttp://www.shnenglu.com/lwch/archive/2012/07/14/183420.html#Feedback1http://www.shnenglu.com/lwch/comments/commentRss/183420.htmlhttp://www.shnenglu.com/lwch/services/trackbacks/183420.html 鍑忓皯鍐呭瓨紕庣墖錛屾彁楂樻ц兘銆?br />
棣栧厛涓嶅緱涓嶆彁鐨勬槸Win32鍜寈64涓浜庢寚閽堢殑闀垮害鏄笉鍚岀殑錛?strong>鍦╓in32涓竴涓寚閽堝崰4瀛楄妭錛岃屽湪x64涓竴涓寚閽堝崰8瀛楄妭
銆備篃姝f槸涓嶆竻妤氳繖涓鐐癸紝褰撴垜鍦▁64涓皢鎸囬拡浣滀負4瀛楄妭淇敼閫犳垚鍏朵粬鏁版嵁寮傚父銆?br />
棣栧厛鎴戜滑鍏堟潵瀹氫箟涓変釜瀹?br />
            #define ALIGN     sizeof(void*)
            #define MAX_BYTES 128
            #define MAX_COUNT (MAX_BYTES / ALIGN)
姝e鍓嶉潰鎵璇寸殑錛屼負浜嗗吋瀹筗in32涓巟64搴旀鎴戜滑灝嗚鐢寵鐨勫唴瀛樻寜void*鐨勫ぇ灝忔潵瀵歸綈銆傛濡傚墠闈㈡墍璇寸殑錛屾垜浠涓哄皬浜?28瀛楄妭鐨勫唴瀛樹負灝忓唴瀛橈紝浼氫駭鐢熷唴瀛樼鐗囷紝搴旀鍦ㄧ敵璇鋒椂搴旇鍔查噺鐢寵涓鍧楄緝澶х殑鍐呭瓨鑰屽皢鍏朵腑鐨勪竴灝忓潡鍒嗛厤緇欎粬銆?br />
鐒跺悗璁╂垜浠潵鐪嬩竴涓嬪唴瀛樻睜涓殑鎴愬憳鍙橀噺
            struct obj
            {
                obj* next;
            };

            struct block
            {
                block* next;
                void*  data;
            };

            obj*   chunk_list[MAX_COUNT];
            size_t chunk_count;
            block* free_list;
榪欓噷浣跨敤obj緇撴瀯鏉ュ瓨鍌ㄥ凡閲婃斁鍐呭瓨鐨勫垪琛紝榪欐牱鍋氱殑濂藉鏄彲浠ユ洿鑺傜渷鍐呭瓨銆傚湪Win32涓嬌鐢ㄨ繖鍧楀唴瀛樼殑鍓?瀛楄妭鏉ユ寚鍚戜笅涓涓妭鐐癸紝鑰屽湪x64涓嬌鐢ㄨ繖鍧楀唴瀛樼殑鍓?瀛楄妭鏉ユ寚鍚戜笅涓涓妭鐐廣?br /> chunk_list錛氫繚瀛橀氳繃deallocate鎴杛efill涓噴鏀炬垨鏄柊鐢寵鐨勫唴瀛樺潡鍒楄〃錛宒eallocate鍜宺efill灝嗕細鍦ㄤ笅鏂囦腑浠嬬粛銆?br /> chunk_count錛氬唴瀛樺潡鍒楄〃涓凡鏈夌殑鍐呭瓨鍧楁暟閲忋?br /> free_list錛氫繚瀛樹簡閫氳繃malloc鐢寵鍐呭瓨鍧楃殑閾捐〃銆?br />
涓嬮潰鎴戜滑鏉ョ湅涓涓嬪唴瀛樻睜鐨勬瀯閫犲嚱鏁頒笌鏋愭瀯鍑芥暟
            MemoryPool() : free_list(0), chunk_count(0)
            {
                for(int i = 0; i < MAX_COUNT; ++i) chunk_list[i] = 0;
            }

            ~MemoryPool()
            {
                block* current = free_list;
                while(current)
                {
                    block* next = current->next;
                    free(current->data);
                    free(current);
                    current = next;
                }
            }
鏋勯犲嚱鏁頒腑鍒濆鍖杅ree_list鍜宑hunk_count涓?錛屽茍鍒濆鍖朿hunk_list涓轟竴涓┖鍒楄〃銆傝屽湪鏋愭瀯鍑芥暟涓垜浠繀欏婚噴鏀炬瘡涓鍧楅氳繃malloc鐢寵鐨勫ぇ鍐呭瓨鍧椼?br />
鎺ヤ笅鏉ユ槸鍐呭瓨鐨勭敵璇?br />
            template <typename T>
            T* allocate(size_t n, void(*h)(size_t))
            {
                if(n == 0) return 0;
                if(n > MAX_BYTES)
                {
                    T* p = (T*)malloc(n);
                    while(p == 0)
                    {
                        h(n);
                        p = (T*)malloc(n);
                    }
                    return p;
                }
                const int i = INDEX(ROUND_UP(n));
                obj* p = chunk_list[i];
                if(p == 0)
                {
                    return refill<T>(i, h);
                }
                chunk_list[i] = p->next;
                return reinterpret_cast<T*>(p);
            }
鍊煎緱娉ㄦ剰鐨勬槸錛屽湪璋冪敤鏃跺繀欏諱紶鍏ヤ竴涓嚱鏁版寚閽堜綔涓哄弬鏁幫紝褰搈alloc鐢寵鍐呭瓨澶辮觸鏃朵細鍘昏皟鐢ㄨ繖涓嚱鏁版潵閲婃斁鍑鴻凍澶熷鐨勫唴瀛樼┖闂淬傚綋瑕佺敵璇風殑鍐呭瓨澶у皬瓚呰繃128瀛楄妭鏃訛紝璋冪敤榛樿鐨刴alloc涓哄叾鐢寵鍐呭瓨銆傚惁鍒欏厛鏌ユ壘鍒楄〃涓槸鍚﹁繕鏈夎凍澶熺殑絀洪棿鍒嗛厤緇欏畠錛岃嫢宸叉病鏈夎凍澶熺殑絀洪棿鍒嗛厤緇欏畠錛屽垯璋冪敤refill鐢寵涓鍧楀ぇ鍐呭瓨銆?br />
鐒跺悗鏄唴瀛橀噴鏀懼嚱鏁癲eallocate
            template <typename T>
            void deallocate(T* p, size_t n)
            {
                if(p == 0) return;
                if(n > MAX_BYTES)
                {
                    free(p);
                    return;
                }
                const int i = INDEX(ROUND_UP(n));
                reinterpret_cast<obj*>(p)->next = chunk_list[i];
                chunk_list[i] = reinterpret_cast<obj*>(p);
            }
鍊煎緱娉ㄦ剰鐨勬槸鍦ㄩ噴鏀炬椂蹇呴』緇欏嚭榪欏潡鍐呭瓨鍧楃殑澶у皬銆傝嫢榪欏潡鍐呭瓨澶т簬128瀛楄妭鏃訛紝璋冪敤榛樿鐨刦ree鍑芥暟閲婃斁鎺夎繖鍧楀唴瀛樸傚惁鍒欏皢鍏跺姞鍒板搴旂殑chunk_list鍒楄〃鍐呫?br />
鐒跺悗鏄皟鏁村唴瀛樺潡澶у皬鍑芥暟reallocate
            template <typename T>
            T* reallocate(T* p, size_t old_size, size_t new_size, void(*h)(size_t))
            {
                if(old_size > MAX_BYTES && new_size > MAX_BYTES)
                {
                    return realloc(p, new_size);
                }
                if(ROUND_UP(old_size) == ROUND_UP(new_size)) return p;
                T* result = allocate<T>(new_size, h);
                const size_t copy_size = new_size > old_size ? old_size : new_size;
                memcpy(result, p, copy_size);
                deallocate<T>(p, old_size);
                return result;
            }
鍙傛暟涓繀欏葷粰鍑鴻繖鍧楀唴瀛樼殑鍘熷澶у皬鍜岃璋冩暣鍚庣殑澶у皬錛屽悓鏃朵篃蹇呴』緇欏嚭褰撳唴瀛樹笉瓚蟲椂鐨勯噴鏀懼嚱鏁扮殑鎸囬拡銆傝嫢鏃у唴瀛樺潡鍜屾柊鍐呭瓨鍧楃殑澶у皬閮藉ぇ浜?28瀛楄妭鏃訛紝璋冪敤榛樿鐨剅ealloc鍑芥暟閲嶆柊鍒嗛厤鍐呭瓨銆傚惁鍒欏厛鎸夎皟鏁村悗鐨勫ぇ灝忕敵璇蜂竴鍧楀唴瀛橈紝騫舵妸鍘熸潵鐨勫唴瀹規嫹璐濊繃鏉ワ紝鏈鍚庨噴鏀炬帀鍘熸潵鐨勫唴瀛樺潡銆傝繖閲屽茍涓嶅緩璁嬌鐢ㄨ繖涓嚱鏁幫紝鑰屾槸鎵嬪姩鐨勫幓閲嶆柊鐢寵鍐呭瓨騫舵嫹璐濋噴鏀俱?br />
鐒跺悗鏉ョ湅4涓潪甯哥畝鍗曠殑璁$畻鍑芥暟
            inline size_t ROUND_UP(size_t bytes)const
            {
                return (bytes + ALIGN - 1) & ~(ALIGN - 1);
            }

            inline size_t ROUND_DOWN(size_t bytes)const
            {
                return bytes & ~(ALIGN - 1);
            }

            inline int INDEX(size_t bytes)const
            {
                return (bytes + ALIGN - 1) / ALIGN - 1;
            }

            inline size_t obj_count(int i)const
            {
                size_t result = 0;
                obj* current = chunk_list[i];
                while(current)
                {
                    ++result;
                    current = current->next;
                }
                return result;
            }
鍓?涓敤浜庡唴瀛樺榻愬拰璁$畻绱㈠紩錛屾渶鍚庝竴涓敤浜庤幏鍙栦竴鍦ㄧ┖闂插垪琛ㄥ唴涓涓唴瀛樺潡鐨勬暟閲忋?br />
鐒跺悗鏄痳efill鍑芥暟錛岀敤浜庡湪娌℃湁絀洪棽鍐呭瓨鍧楁椂鐢寵涓鍧楀ぇ鍐呭瓨鍧?br />
            template <typename T>
            T* refill(int i, void(*h)(size_t))
            {
                const int count = 20;
                const int preSize = (i + 1) * ALIGN;
                char* p = (char*)malloc(preSize * count);
                while(p == 0)
                {
                    h(preSize * count);
                    p = (char*)malloc(preSize * count);
                }
                block* pBlock = (block*)malloc(sizeof(block));
                while(pBlock == 0)
                {
                    h(sizeof(block));
                    pBlock = (block*)malloc(sizeof(block));
                }
                pBlock->data = p;
                pBlock->next = free_list;
                free_list = pBlock;
                obj* current = (obj*)(p + preSize);
                for(int j = 0; j < count - 1; ++j)
                {
                    current->next = chunk_list[i];
                    chunk_list[i] = current;
                    current = (obj*)((char*)current + preSize);
                }
                chunk_count += count - 1;
                rebalance();
                return reinterpret_cast<T*>(p);
            }
棣栧厛鐢寵涓涓ぇ鍐呭瓨鍧楋紝鐒跺悗灝嗚繖鍧楃敵璇峰埌鐨勫唴瀛樺潡鏀懼叆free_list閾捐〃鍐咃紝鏈鍚庣粍緇囪搗chunk_list涓搴斿唴瀛樺崱鍧楃殑閾捐〃錛岀劧鍚庨噸鏂拌皟鏁碿hunk_list鍒楄〃錛屾渶鍚庡皢鐢寵鍒扮殑鍐呭瓨鍧楄繑鍥炪?br />
鏈鍚庢潵鐪嬩竴涓嬭皟鏁村嚱鏁皉ebalance
            void rebalance()
            {
                for(int i = MAX_COUNT - 1; i > 0; --i)
                {
                    const size_t avge = chunk_count / MAX_COUNT;
                    size_t count = obj_count(i);
                    if(count > avge)
                    {
                        const int preSize = ROUND_DOWN((i + 1) * ALIGN / 2);
                        const int j = INDEX(preSize);
                        for(int k = count; k > avge; --k)
                        {
                            obj* chunk = chunk_list[i];
                            chunk_list[i] = chunk_list[i]->next;
                            if(i % 2 == 1)
                            {
                                chunk->next = (obj*)((char*)chunk + preSize);
                                chunk->next->next = chunk_list[j];
                                chunk_list[j] = chunk;
                            }
                            else
                            {
                                chunk->next = chunk_list[j];
                                chunk_list[j] = chunk;
                                obj* next = (obj*)((char*)chunk + preSize);
                                next->next = chunk_list[j + 1];
                                chunk_list[j + 1] = next;
                            }
                            ++chunk_count;
                        }
                    }
                }
            }
榪欓噷浠庡悗鑷沖墠鏌ョ湅瀵瑰簲鍐呭瓨鍧楃┖闂查摼琛ㄧ殑闀垮害錛岃嫢瓚呰繃騫沖潎鏁伴噺錛屽垯灝嗗叾鍒囧垎涓?鍧楄緝灝忕殑鍐呭瓨鍧楁斁鍏ュ搴旂殑閾捐〃鍐呫傝繖鏍峰仛鐨勫ソ澶勬槸鍙互褰㈡垚涓涓噾瀛楀褰㈢殑鍒嗗竷鐘跺喌錛屾棦瓚婂皬鐨勫唴瀛樺潡澶у皬鎷ユ湁鐨勮妭鐐規暟閲忚秺澶氾紝姝e鏈枃寮澶存墍璇達紝浣跨敤鍐呭瓨姹犳槸涓轟簡瑙e喅鍦ㄧ敵璇峰皬鍧楀唴瀛樻椂閫犳垚鐨勫唴瀛樼鐗囥?br />
鑷蟲錛屽唴瀛樻睜鐨勮瑙e凡瀹屾垚錛屽畬鏁寸殑浠g爜璇峰埌http://qlanguage.codeplex.com涓嬭澆

lwch 2012-07-14 18:40 鍙戣〃璇勮
]]>
灞卞STL瀹炵幇涔媣ectorhttp://www.shnenglu.com/lwch/archive/2012/06/17/179179.htmllwchlwchSun, 17 Jun 2012 09:08:00 GMThttp://www.shnenglu.com/lwch/archive/2012/06/17/179179.htmlhttp://www.shnenglu.com/lwch/comments/179179.htmlhttp://www.shnenglu.com/lwch/archive/2012/06/17/179179.html#Feedback4http://www.shnenglu.com/lwch/comments/commentRss/179179.htmlhttp://www.shnenglu.com/lwch/services/trackbacks/179179.html
        template <typename T>
        class vector
        {
        };

璁╂垜浠厛鏉ョ湅鐪媣ector涓殑涓浜涘埆鍚?br />
        public:
            typedef T         value_type;
            typedef T*        pointer;
            typedef T&        reference;
            typedef const T&  const_reference;
            typedef size_t    size_type;
            typedef ptrdiff_t difference_type;
            typedef const T* const_iterator;
            typedef reverse_iterator<const_iterator, value_type, size_type, difference_type> const_reverse_iterator;
            typedef T* iterator;
            typedef reverse_iterator<iterator, value_type, size_type, difference_type> reverse_iterator;
鐢變笂鍙錛屾濡?a href="http://www.shnenglu.com/lwch/archive/2012/06/02/177248.html">涓婁竴綃?/a>鎵璇達紝vector鐨勮凱浠e櫒鏄敱鍘熺敓鐨勬寚閽堟潵瀹炵幇鐨勩?br />
涓嬮潰鏄叾鍐呴儴鐨勬垚鍛樺彉閲?br />
        protected:
            typedef vector<T>    self;
            typedef allocator<T> Alloc;

            iterator start;
            iterator finish;
            iterator end_of_element;
start錛氭寚鍚憊ector鐨勮搗濮嬪湴鍧
finish錛氭寚鍚戞渶鍚庝竴涓厓绱犵殑鍚庝竴涓厓绱犵殑鍦板潃
end_of_element錛氭寚鍚戝凡鐢寵鍐呭瓨鍧楃殑緇撴潫浣嶇疆錛坒inish鎬繪槸灝忎簬鎴栫瓑浜巈nd_of_element錛?br />
鍦⊿TL涓粠begin鍒癳nd鎬繪槸浠ヤ竴涓墠闂悗寮鐨勫艦寮忔潵琛ㄧず鐨勶紝褰㈠[begin,end)錛岃繖鏍峰仛鐨勫ソ澶勬槸鍙互浣夸唬鐮佸啓鐨勬洿綆媧侊細
        template <typename Iterator, typename T>
        Iterator find(Iterator first, Iterator last, const T& value)
        {
            while(first != last && *first != value) ++first;
            return first;
        }

涓嬮潰鏉ョ湅鐪媣ector涓渶鍩烘湰鐨勬瀯閫犲嚱鏁板拰鏋愭瀯鍑芥暟
            vector() : start(0), finish(0), end_of_element(0)
            {
            }

            ~vector()
            {
                destruct(start, end_of_element);
                if (start != 0) Alloc::deallocate(start, end_of_element - start);
            }
榪欓噷灝嗗叾涓殑3涓垚鍛樺彉閲忛兘濉厖涓?銆?br /> 濡?a href="http://www.shnenglu.com/lwch/archive/2012/06/02/177248.html">涓婁竴綃?/a>鎵璇達紝鍦⊿TL涓槸灝嗗唴瀛樺垎閰嶄笌瀵硅薄鍒濆鍖栧垎寮鐨勶紝鍚屾牱瀵硅薄鏋愭瀯涓庡唴瀛橀噴鏀句篃鏄鍒嗗紑鐨勩?br />
鐒跺悗鏄叾begin鍜宔nd鏂規硶錛岀敤鏉ヨ幏鍙栫涓涓厓绱犲拰鏈鍚庝竴涓厓绱犵殑鍚庝竴涓厓绱犵殑榪唬鍣ㄣ?br />
            inline iterator begin()
            {
                return start;
            }

            inline const_iterator begin()const
            {
                return start;
            }

            inline iterator end()
            {
                return finish;
            }

            inline const_iterator end()const
            {
                return finish;
            }

front鍜宐ack鍒嗗埆琚敤鏉ヨ幏鍙栫涓涓厓绱犲拰鏈鍚庝竴涓厓绱?br />
            inline reference front()
            {
                return *begin();
            }

            inline const_reference front()const
            {
                return *begin();
            }

            inline reference back()
            {
                return *(end() - 1);
            }

            inline const_reference back()const
            {
                return *(end() - 1);
            }

empty銆乻ize銆乧apacity鍒嗗埆琚敤鏉ュ垽鍒鍣ㄦ槸鍚︿負絀恒佸鍣ㄥ唴鍏冪礌鐨勪釜鏁板拰瀹瑰櫒鐨勫ぇ灝?br />
            inline bool empty()const
            {
                return begin() == end();
            }

            inline const size_type size()const
            {
                return size_type(end() - begin());
            }

            inline const size_type capacity()const
            {
                return size_type(end_of_element - begin());
            }

鐢變簬鍦╲ector鐨勫ご閮ㄦ彃鍏ュ厓绱犱細浣挎墍鏈夊厓绱犲悗縐伙紝搴旀瀹冭璁捐涓哄崟鍚戠殑錛屽彧鑳界敱灝鵑儴鎻掑叆鎴栫Щ闄ゆ暟鎹?br />
            void push_back(const T& x)
            {
                if (end_of_element != finish)
                {
                    construct(&*finish, x);
                    ++finish;
                }
                else
                {
                    insert_aux(end(), x);
                }
            }

            inline void pop_back()
            {
                --finish;
                destruct<T>(finish, has_destruct(*finish));
            }
褰撶劧浠庡ご閮ㄧЩ闄ゆ暟鎹篃騫墮潪涓嶅彲浠ワ紝鍙互浣跨敤erase鏂規硶鏉ョЩ闄ゅご閮ㄧ殑鏁版嵁錛宔rase鏂規硶灝嗕細鍦ㄥ悗闈㈢殑閮ㄥ垎浣滃嚭璇存槑銆?br />
鎴戜滑鍏堟潵鐪嬩竴涓媔nsert_aux榪欎釜鏂規硶錛屽湪鎻掑叆鍏冪礌鏃跺嚑涔庨兘浣跨敤鍒頒簡榪欎釜鏂規硶銆?br />
            void insert_aux(const iterator position, const T& x)
            {
                if(finish != end_of_element)
                {
                    construct(&*finish, *(finish - 1));
                    T x_copy = x;
                    copy_backward(position, finish - 1, finish);
                    *position = x_copy;
                    ++finish;
                }
                else
                {
                    const size_type old_size = size();
                    const size_type new_size = old_size == 0 ? 2 : old_size * 2;
                    iterator tmp = Alloc::allocate(new_size);
                    uninitialized_copy(begin(), position, tmp);
                    iterator new_position = tmp + (position - begin());
                    construct(&*new_position, x);
                    uninitialized_copy(position, end(), new_position + 1);
                    destruct(begin(), end());
                    Alloc::deallocate(begin(), old_size);
                    end_of_element = tmp + new_size;
                    finish = tmp + old_size + 1;
                    start = tmp;
                }
            }
鍦ㄥ鍣ㄨ繕鏈夎凍澶熺殑絀洪棿鏃訛紝棣栧厛灝嗕粠position浣嶇疆鍒癴inish浣嶇疆鐨勫厓绱犳暣浣撳悗縐諱竴涓綅緗紝鏈鍚庡皢瑕佽鎻掑叆鐨勫厓绱犲啓鍏ュ埌鍘焢osition鐨勪綅緗悓鏃舵敼鍙榝inish鎸囬拡鐨勫箋?br /> 鑻ョ┖闂翠笉瓚蟲椂錛岄鍏堟牴鎹師鏈夌┖闂寸殑澶у皬鐨勪竴鍊嶆潵鐢寵鍐呭瓨錛岀劧鍚庡皢鍏冪礌浠庡師鏈変綅緗殑begin鍒皃osition鎷瘋礉鍒版柊鐢寵鐨勫唴瀛樹腑錛岀劧鍚庡湪鏂扮敵璇峰唴瀛樼殑鎸囧畾浣嶇疆鎻掑叆瑕佹彃鍏ョ殑鍏冪礌鍊鹼紝鏈鍚庡皢浣欎笅鐨勯儴鍒嗕篃鎷瘋礉榪囨潵銆傜劧鍚庡皢鍘熸湁鍏冪礌鏋愭瀯鎺夊茍鎶婂唴瀛橀噴鏀炬帀銆?br />
涓轟綍涓嶄嬌鐢?/span>reallocate?
reallocate鐨勬湰鎰忓茍涓嶆槸鍦ㄥ師鏈夊唴瀛樼殑浣嶇疆澧炲姞鎴栧噺灝戝唴瀛橈紝reallocate棣栧厛浼氳瘯鍥懼湪鍘熸湁鐨勫唴瀛樹綅緗鍔犳垨鍑忓皯鍐呭瓨錛?strong>鑻ュけ璐ュ垯浼氶噸鏂扮敵璇蜂竴鍧楁柊鐨勫唴瀛樺茍鎶婂師鏈夌殑鏁版嵁鎷瘋礉榪囧幓錛岃繖縐嶆搷浣滄湰璐ㄤ笂絳変環浜庨噸鏂扮敵璇蜂竴鍧楀唴瀛橈紝搴旀榪欓噷浣跨敤鐨勬槸allocate鑰屽茍闈瀝eallocate銆?br />
鐒跺悗璁╂垜浠潵鐪嬩竴涓媔nsert鍜宔rase鏂規硶
            inline iterator insert(iterator position, const T& x)
            {
                const size_type pos = position - begin();
                if(finish != end_of_element && position == end())
                {
                    construct(&*finish, x);
                    ++finish;
                }
                else insert_aux(position, x);
                return begin() + pos;
            }

            iterator erase(iterator position)
            {
                destruct(position, has_destruct(*position));
                if (position + 1 != end())
                {
                    copy(position + 1, end(), position);
                }
                --finish;
                return position;
            }
鑻ユ槸瑕佸湪鏈鍚庢彃鍏ヤ竴涓厓绱犱笖瀹瑰櫒鐨勫墿浣欑┖闂磋繕瓚沖鐨勮瘽錛岀洿鎺ュ皢鍏冪礌鎻掑叆鍒癴inish鐨勪綅緗紝騫跺皢finish鎸囬拡鍚庣Щ涓浣嶅嵆鍙傝嫢瀹瑰櫒絀洪棿涓嶅鎴栦笉鏄彃鍦ㄦ渶鍚庝竴涓殑浣嶇疆錛屽垯璋冪敤insert_aux閲嶆柊鍒嗛厤鍐呭瓨鎴栨彃鍏ャ?br /> 鍒犻櫎鏃墮鍏堟瀽鏋勬帀鍘熸湁鍏冪礌錛岃嫢琚垹鍏冪礌涓嶆槸鏈鍚庝竴涓厓绱狅紝鍒欏皢鍚庨潰鐨勬墍鏈夊厓绱犳嫹璐濊繃鏉ワ紝鏈鍚庡皢finish鎸囬拡鍓嶇Щ涓涓綅緗?br />
鏈鍚庤鎴戜滑鏉ョ湅涓涓嬪叾涓噸杞界殑榪愮畻絎?br />
            self& operator=(const self& x)
            {
                if(&x == thisreturn *this;
                size_type const other_size = x.size();
                if(other_size > capacity())
                {
                    destruct(start, finish);
                    Alloc::deallocate(start, capacity());
                    start = Alloc::allocate(other_size);
                    finish = uninitialized_copy(x.begin(), x.end(), start);
                    end_of_element = start + other_size;
                }
                else
                {
                    finish = uninitialized_copy(x.begin(), x.end(), start);
                }
                return *this;
            }

            inline reference operator[](size_type n)
            {
                return *(begin() + n);
            }

            inline value_type at(size_type n)
            {
                return *(begin() + n);
            }
鐢變簬vector鍐呴儴鐢ㄧ殑鏄師鐢熺殑鎸囬拡錛屽簲姝よ繖浜涜繍綆楃鐨勪嬌鐢ㄦ柟寮忓拰鍘熺敓鎸囬拡鐨勫茍鏃犲樊寮傘?strong>鍊煎緱娉ㄦ剰鐨勬槸鍦ㄥ仛璧嬪兼搷浣滄椂浼氫駭鐢熷唴瀛樼殑閲嶆柊鍒嗛厤涓庢嫹璐濇搷浣溿?br />
鑷蟲錛寁ector鐨勮瑙e凡瀹屾垚錛屽畬鏁寸殑浠g爜璇峰埌http://qlanguage.codeplex.com涓嬭澆

lwch 2012-06-17 17:08 鍙戣〃璇勮
]]>
灞卞STL瀹炵幇涔媡raits,construct&destructhttp://www.shnenglu.com/lwch/archive/2012/06/02/177248.htmllwchlwchSat, 02 Jun 2012 14:39:00 GMThttp://www.shnenglu.com/lwch/archive/2012/06/02/177248.htmlhttp://www.shnenglu.com/lwch/comments/177248.htmlhttp://www.shnenglu.com/lwch/archive/2012/06/02/177248.html#Feedback3http://www.shnenglu.com/lwch/comments/commentRss/177248.htmlhttp://www.shnenglu.com/lwch/services/trackbacks/177248.html
鍏堟潵鐪嬬湅STL涓渶鍩烘湰鐨勫璞terator
        template <typename T, typename Size = size_t, typename Difference = ptrdiff_t>
        struct iterator
        {
            typedef T                               value_type;
            typedef Difference                      difference_type;
            typedef T*                              pointer;
            typedef T&                              reference;
            typedef const T*                        const_pointer;
            typedef const T&                        const_reference;
            typedef iterator<T, Size, Difference>   self;
        };

        template <typename T, typename Size = size_t, typename Difference = ptrdiff_t>
        struct const_iterator : public iterator<T>
        {
        };
鐢變互涓婁唬鐮佸彲鐭ワ紝瀵逛簬姣忎竴涓猧terator蹇呴』瀹氫箟鍏秜alue_type,size_type,difference_type,pointer,reference,const_pointer,const_reference鍜宻elf綾誨瀷銆?nbsp;
涓銆乿alue_type
value_type鎸囩ず浜嗚榪唬鍣ㄦ墍淇濆瓨鐨勫肩被鍨?br /> 浜屻乨ifference_type
difference_type鐢ㄦ潵鎸囩ず涓や釜榪唬鍣ㄤ箣闂寸殑璺濈綾誨瀷
涓夈乸ointer,reference,const_pointer,const_reference
鍒嗗埆鏄墍鎸囦箣鐗╃殑鎸囬拡,寮曠敤,鎸囬拡甯擱噺鍜屽紩鐢ㄥ父閲忕殑綾誨瀷
鍥涖乻elf
self涓鴻榪唬鍣ㄨ嚜韜殑綾誨瀷

涓嬮潰鏉ョ湅涓涓媔terator_traits錛宨terator_traits涓昏鐢ㄦ潵钀冨彇榪唬鍣╥terator鐨勫肩被鍨嬬瓑
        template <typename Iterator>
        struct iterator_traits
        {
            typedef typename Iterator::value_type      value_type;
            typedef typename Iterator::difference_type difference_type;
            typedef typename Iterator::pointer         pointer;
            typedef typename Iterator::reference       reference;
            typedef typename Iterator::const_pointer   const_pointer;
            typedef typename Iterator::const_reference const_reference;
            typedef typename Iterator::self            self_type;
        };

榪欓噷鏈変竴鐐瑰彲浠ユ彁鍓嶉鍛婁竴涓嬶紝vector浣滀負涓涓鍣紝鍏跺唴閮ㄦ槸浣跨敤鎸囬拡浣滀負榪唬鍣ㄧ殑錛岄偅涔堟垜浠浣曡悆鍙栧嚭瀹冪殑鍊肩被鍨嬬瓑鍛紵
絳旀寰堢畝鍗曪紝鐗逛緥鍖栵紝閭d箞鎴戜滑灝辨潵涓篿terator_traits鍒嗗埆鍋氫袱縐峊*鍜宑onst T*鐨勭壒渚嬪寲
        template <typename T>
        struct iterator_traits<T*>
        {
            typedef T         value_type;
            typedef ptrdiff_t difference_type;
            typedef T*        pointer;
            typedef T&        reference;
            typedef const T*  const_pointer;
            typedef const T&  const_reference;
            typedef T*        self_type;
        };

        template <typename T>
        struct iterator_traits<const T*>
        {
            typedef T         value_type;
            typedef ptrdiff_t difference_type;
            typedef T*        pointer;
            typedef T&        reference;
            typedef const T*  const_pointer;
            typedef const T&  const_reference;
            typedef const T*  self_type;
        };
鑷蟲錛屾垜浠彲浠ョ敤iterator_traits钀冨彇鍑烘瘡縐峣terator鐨勫肩被鍨嬬瓑鍐呭浜嗐?br />
涔嬪墠宸茬粡璇村埌浜嗭紝閫氳繃traits鍙互钀冨彇鍑轟竴浜涘璞$殑鐗規э紝浠庤屾彁楂樹唬鐮佺殑鏁堢巼銆備簨瀹炵‘瀹炲姝わ紝閫氳繃traits鍙悆鍙栧嚭涓涓璞℃槸鍚︽槸涓涓狿OD瀵硅薄錛屽浜庝竴涓狿OD瀵硅薄錛屾垜浠湪鎷瘋礉鏃訛紝涓嶅簲璇ヤ嬌鐢ㄥ叾鎷瘋礉鏋勯犲嚱鏁版垨鏄痮perator=錛岃岀敤memcpy鍒欐晥鐜囨洿楂樸?br /> 涓嬮潰鎴戜滑鏉ョ湅涓涓媉_type_traits
        struct __true_type
        {
        };

        struct __false_type
        {
        };

        template <typename I>
        struct __type_traits
        {
            typedef __false_type has_default_construct;
            typedef __false_type has_copy_construct;
            typedef __false_type has_assign_operator;
            typedef __false_type has_destruct;
            typedef __false_type is_POD;
        };
涓嶅緱涓嶆彁鐨勬槸鍏朵腑鍒嗗埆鐢╛_true_type鍜宊_false_type鏉ヨ〃紺烘槸鍚﹀瓨鍦ㄨ繖涓壒鎬с?br />
閭d箞鎴戜滑濡備綍钀冨彇鍑哄熀紜綾誨瀷璇稿int,char絳夌殑鐗規у憿錛?br /> 絳旀渚濈劧鏄壒渚嬪寲錛岃繖閲屼唬鐮佷笉鍐嶈創鍑猴紝鏂囨湯浼氱粰鍑哄畬鏁翠唬鐮佺殑璇︾粏鍦板潃銆?br />
鏈鍚庢垜浠嬌鐢ㄤ竴涓猦ash_destruct鐨勫嚱鏁版潵鑾峰彇鍑鴻繖涓被鍨嬫槸鍚︽湁鏋愭瀯鍑芥暟銆?br />
        template <typename T>
        inline auto has_destruct(const T&)->decltype(static_cast<__type_traits<T>::has_destruct*>(0))
        {
            return static_cast<typename __type_traits<T>::has_destruct*>(0);
        }

        template <typename T>
        inline auto has_destruct(T*)->decltype(static_cast<__type_traits<T>::has_destruct*>(0))
        {
            static_assert(false, "Please use const T& not T*");
            return static_cast<typename __type_traits<T>::has_destruct*>(0);
        }

        template <typename T>
        inline auto has_destruct(const T*)->decltype(static_cast<__type_traits<T>::has_destruct*>(0))
        {
            static_assert(false, "Please use const T& not const T*");
            return static_cast<typename __type_traits<T>::has_destruct*>(0);
        }
涓嶅緱涓嶆彁鐨勬槸C++0x鐨勭‘寰堝己澶э紝鍙互閫氳繃褰㈠弬鏉ョ‘瀹氳繑鍥炲肩殑綾誨瀷錛岃繖鏍鋒垜浠氨鍙互钀冨彇鍑鴻繖涓被鍨嬬殑has_destruct鍩熸槸__true_type鎴栨槸__false_type浜嗐?br />
鏈鍚庢潵鐪嬬湅construct鍜宒estruct鐨勪唬鐮侊紝鍦⊿TL涓璞$殑鍐呭瓨鍒嗛厤鍜屾瀯閫犳槸琚垎寮鐨勶紝瀵逛簬鍩虹瀵硅薄int,char絳夛紝鍦ㄦ瀽鏋勬椂鎴戜滑鏃犻渶璋冪敤鍏舵瀽鏋勫嚱鏁般?br /> 涓嬮潰鏉ョ湅construct鍜宒estruct鐨勫疄鐜?br />
        template <typename T1, typename T2>
        inline void construct(T1* p, const T2& value)
        {
            new (p) T1(value);
        }

        template <typename T>
        inline void destruct(T* p, __true_type*)
        {
            p->~T();
        }

        template <typename T>
        inline void destruct(T*, __false_type*)
        {
        }

        template <typename ForwardIterator>
        inline void destruct(ForwardIterator first, ForwardIterator last)
        {
            while(first != last)
            {
                destruct(first, has_destruct(*first));
                ++first;
            }
        }
鑷蟲錛屽叧浜巘raits鎶鏈拰construct鍙奷estruct鐨勮瑙e凡瀹屾垚錛屽畬鏁寸殑浠g爜璇峰埌http://qlanguage.codeplex.com/涓嬭澆

lwch 2012-06-02 22:39 鍙戣〃璇勮
]]>
灞卞STL瀹炵幇涔媋llocatorhttp://www.shnenglu.com/lwch/archive/2012/05/20/175498.htmllwchlwchSun, 20 May 2012 13:45:00 GMThttp://www.shnenglu.com/lwch/archive/2012/05/20/175498.htmlhttp://www.shnenglu.com/lwch/comments/175498.htmlhttp://www.shnenglu.com/lwch/archive/2012/05/20/175498.html#Feedback0http://www.shnenglu.com/lwch/comments/commentRss/175498.htmlhttp://www.shnenglu.com/lwch/services/trackbacks/175498.html浣滀負涓涓北瀵ㄧ殑STL錛岄偅涔堜笉寰椾笉鎻愮殑鏄叾涓殑allocator錛堢┖闂撮厤緗櫒錛夈傞【鍚嶆濅箟錛屽畠鏄礋璐g┖闂村垎閰嶇敤鐨勶紝涓嬮潰浠g爜鍗佸垎綆鍗曪紝浠呭C鍑芥暟malloc鍜宖ree榪涜浜嗚杽钖勭殑涓灞傚皝瑁咃紝鍚屾椂緇欏畾浜嗚嚜瀹氫箟鍑芥暟free_handler鐢ㄤ簬鍦ㄧ┖闂村垎閰嶆椂鍊欑敱浜庡唴瀛樿鍗犳弧浜嗚屽鑷寸殑鍒嗛厤澶辮觸銆?br />
榪欓噷鍊煎緱娉ㄦ剰鐨勬槸錛氳繖涓噴鏀懼嚱鏁扮殑鍑芥暟鎸囬拡搴旇鏄敱璋冪敤鏂規潵璐熻矗鎸囧畾錛屽茍涓斿畠浠呮湁涓涓弬鏁拌〃鏄庤嚦灝戦渶瑕侀噴鏀懼灝戝瓧鑺傜殑鍐呭瓨銆?br />
涓嬮潰鏉ョ湅浠g爜錛屼唬鐮侀潪甯哥畝鍗曪紝搴旀榪欓噷灝變笉閫愪竴灞曞紑璇存槑浜嗐?
#ifndef _QLANGUAGE_LIBRARY_ALLOC_H_
#define _QLANGUAGE_LIBRARY_ALLOC_H_

#if 0
#include 
<new>
#define __THROW_BAD_ALLOC throw std::bad_alloc
#elif !defined(__THROW_BAD_ALLOC)
#include 
<iostream>
#define __THROW_BAD_ALLOC std::cerr << "out of memory" << std::endl; exit(1)
#endif

namespace QLanguage
{
    
namespace Library
    
{
        template 
<typename T>
        
class allocator
        
{
        
public:
            allocator()
            
{
            }


            allocator(
const allocator<T>&)
            
{
            }


            
static T* allocate()
            
{
                
const size_t size = sizeof(T);
                T
* result = (T*)malloc(size);
                
while(result == nullptr)
                
{
                    
if(free_handler) free_handler(size);
                    
else __THROW_BAD_ALLOC;
                    result 
= (T*)malloc(size);
                }

                
return result;
            }


            
static T* allocate(const size_t& n)
            
{
                
const size_t size = n * sizeof(T);
                
if(size <= 0throw "bad allocate size";
                T
* result = (T*)malloc(size);
                
while(result == nullptr)
                
{
                    
if(free_handler) free_handler(size);
                    
else __THROW_BAD_ALLOC;
                    result 
= (T*)malloc(size);
                }

                
return result;
            }


            
static void deallocate(T* p)
            
{
                free(p);
            }


            
static void deallocate(T* p, const size_t&)
            
{
                free(p);
            }


            
static T* reallocate(T* p, const size_t& n)
            
{
                
const size_t size = n * sizeof(T);
                
if(size <= 0throw "bad reallocate size";
                T
* result = (T*)realloc(p, size);
                
while(result == nullptr)
                
{
                    
if(free_handler) free_handler(size);
                    
else __THROW_BAD_ALLOC;
                    result 
= (T*)realloc(p, size);
                }

                
return result;
            }

        
public:
            
static void(*free_handler)(const size_t&);

            
static void set_handler(void(*h)(const size_t&))
            
{
                free_handler 
= h;
            }

        }
;

        template 
<typename T>
        typename 
void (*allocator<T>::free_handler)(const size_t&= nullptr;
    }

}


#endif

瀹屾暣浠g爜璇峰埌http://qlanguage.codeplex.com/涓嬭澆

lwch 2012-05-20 21:45 鍙戣〃璇勮
]]>
灞卞STL瀹炵幇絎旇http://www.shnenglu.com/lwch/archive/2012/05/20/175491.htmllwchlwchSun, 20 May 2012 12:08:00 GMThttp://www.shnenglu.com/lwch/archive/2012/05/20/175491.htmlhttp://www.shnenglu.com/lwch/comments/175491.htmlhttp://www.shnenglu.com/lwch/archive/2012/05/20/175491.html#Feedback1http://www.shnenglu.com/lwch/comments/commentRss/175491.htmlhttp://www.shnenglu.com/lwch/services/trackbacks/175491.html
  • 鏁版嵁緇撴瀯
    1. allocator
    2. 鍐呭瓨姹?/a>
    3. 鍐呭瓨姹燰2
    4. traits,construct&destruct
    5. vector
    6. list
    7. rbtree
    8. map&set
    9. hashtable
    10. hash_map&hash_set
  • 綆楁硶


  • lwch 2012-05-20 20:08 鍙戣〃璇勮
    ]]>
    青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美国产日韩一区| 久久精品国产精品亚洲综合| 亚洲国产高清自拍| 欧美一区二区三区视频免费| 国产欧美一区二区白浆黑人| 久久国产毛片| 可以免费看不卡的av网站| 亚洲黄色影院| 日韩亚洲欧美成人一区| 国产区在线观看成人精品| 久久久久久久久伊人| 免费成人高清| 亚洲性图久久| 欧美一级欧美一级在线播放| 樱桃国产成人精品视频| 亚洲精品久久嫩草网站秘色| 国产精品福利久久久| 久久精品一区二区| 欧美激情第3页| 欧美一区二区日韩一区二区| 老司机免费视频一区二区| 一区二区三区 在线观看视频| 亚洲午夜激情在线| 亚洲狠狠丁香婷婷综合久久久| 99热精品在线| 亚洲成人在线视频网站| 亚洲一区二区三区乱码aⅴ| 激情文学一区| 中文精品在线| 亚洲三级电影全部在线观看高清| 亚洲一级一区| 亚洲老板91色精品久久| 亚洲一区免费看| 久久躁日日躁aaaaxxxx| 亚洲自拍偷拍麻豆| 欧美凹凸一区二区三区视频| 午夜精品久久久久久久蜜桃app | 欧美一级久久久久久久大片| 日韩天堂在线观看| 久久久久国产一区二区三区| 亚洲尤物在线| 欧美激情久久久久久| 久久久一二三| 国产精品乱码一区二区三区| 亚洲国产精品精华液网站| 国产一区二区三区黄| 中文一区二区| 亚洲无人区一区| 欧美国产大片| 亚洲福利一区| 亚洲经典三级| 卡通动漫国产精品| 久久久久综合网| 国产日韩1区| 亚洲欧美日本伦理| 亚洲欧美在线播放| 国产精品久久久久毛片软件 | 欧美黑人在线播放| 一区二区三区自拍| 久久精品视频导航| 老司机免费视频久久| 国产午夜精品在线观看| 香蕉精品999视频一区二区| 午夜精彩视频在线观看不卡 | 欧美mv日韩mv国产网站| 欧美电影免费网站| 亚洲高清av| 欧美va亚洲va日韩∨a综合色| 女女同性女同一区二区三区91| 国产曰批免费观看久久久| 欧美一区二区三区四区在线| 久久国产主播| 一区精品久久| 欧美成人精品一区二区| 亚洲精品国久久99热| 中日韩午夜理伦电影免费| 欧美色中文字幕| 亚洲性图久久| 久久se精品一区二区| 一区二区在线观看视频| 久久综合色综合88| 亚洲精品字幕| 欧美一级播放| 亚洲电影免费观看高清完整版在线| 久久亚洲精品欧美| 亚洲精品影视在线观看| 欧美一级久久| 亚洲国产美女精品久久久久∴| 欧美成人乱码一区二区三区| 一本一本久久a久久精品综合妖精| 性刺激综合网| 亚洲国产精品成人综合色在线婷婷| 欧美国产欧美综合| 亚洲一区在线看| 欧美成人首页| 国产欧美日韩综合一区在线播放| 久久精品毛片| 一本一本久久a久久精品综合妖精| 欧美中文字幕在线观看| 亚洲国产三级| 国产精品视频免费| 开心色5月久久精品| 亚洲图片欧美一区| 亚洲第一久久影院| 欧美一区二区高清| 99精品视频免费全部在线| 国产日韩欧美黄色| 欧美日韩国产麻豆| 久久亚洲国产精品日日av夜夜| 一区二区高清| 亚洲国产精品尤物yw在线观看| 欧美一级午夜免费电影| 亚洲乱码久久| 影音欧美亚洲| 国产日韩欧美日韩| 欧美日韩国产综合视频在线| 久久久久久9999| 亚洲综合日本| 99国产精品99久久久久久粉嫩| 蜜桃av综合| 久久久久看片| 午夜视频在线观看一区二区| 99国产精品久久久久老师| 在线成人黄色| 国产综合婷婷| 国产亚洲欧美另类中文| 国产精品二区在线观看| 欧美视频福利| 欧美精品18| 欧美福利精品| 欧美大片在线观看一区| 麻豆亚洲精品| 久色成人在线| 欧美成人四级电影| 蜜桃视频一区| 免费在线一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美一级视频精品观看| 午夜精品美女自拍福到在线 | 亚洲视频一二区| 国产精品99久久不卡二区| 一本色道久久88综合日韩精品| 亚洲精品欧美| 欧美成在线视频| 亚洲电影免费观看高清完整版| 欧美成人资源| 亚洲国产精品一区| 99精品国产福利在线观看免费| 亚洲美女在线视频| 一本久久综合亚洲鲁鲁五月天| 99香蕉国产精品偷在线观看| 亚洲天堂网站在线观看视频| 亚洲午夜影视影院在线观看| 午夜精品成人在线| 欧美一区二区三区在线播放| 久久国内精品自在自线400部| 久久久精品一区| 欧美风情在线| 国产精品久久久久一区| 国产丝袜一区二区| 1024成人网色www| 99国产欧美久久久精品| 亚洲一区精品电影| 久久成人一区| 欧美激情无毛| 亚洲线精品一区二区三区八戒| 欧美一区二区福利在线| 噜噜噜91成人网| 国产精品高清网站| 好看的日韩视频| 夜夜爽99久久国产综合精品女不卡| 亚洲欧美日韩综合一区| 久热精品视频在线免费观看| 亚洲激情黄色| 亚洲免费小视频| 91久久在线观看| 午夜一区二区三区不卡视频| 另类人畜视频在线| 国产精品乱码一区二区三区| 在线日韩欧美| 欧美一级午夜免费电影| 亚洲国产成人av| 欧美在线3区| 欧美日韩国产a| 樱桃国产成人精品视频| 香蕉成人伊视频在线观看| 农夫在线精品视频免费观看| 中文在线资源观看网站视频免费不卡 | 亚洲激情国产精品| 久久精品国产一区二区电影 | 亚洲欧美日韩国产精品| 欧美sm重口味系列视频在线观看| 国产日韩欧美二区| 亚洲色在线视频| 亚洲电影免费观看高清完整版在线| 亚洲视频观看| 欧美日本不卡| 亚洲伦理精品| 久久尤物视频| 欧美亚洲系列|