锘??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 GMT60- QCore/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鐨勮鏄庯紝瀹岀粨姝ゆ枃

]]>- 灞卞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(true, false, false, true);
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" />
]]> - 濡備綍姣旇緝涓や釜鍙橀噺鐨勭被鍨嬫槸鍚︾浉鍚?/title>http://www.shnenglu.com/lwch/archive/2012/08/25/188253.htmllwchlwchSat, 25 Aug 2012 08:13:00 GMThttp://www.shnenglu.com/lwch/archive/2012/08/25/188253.htmlhttp://www.shnenglu.com/lwch/comments/188253.htmlhttp://www.shnenglu.com/lwch/archive/2012/08/25/188253.html#Feedback0http://www.shnenglu.com/lwch/comments/commentRss/188253.htmlhttp://www.shnenglu.com/lwch/services/trackbacks/188253.html template <typename T1, typename T2>
inline const bool compare_type(T1, T2)
{
return false;
}
template <>
inline const bool compare_type(int, int)
{
return true;
}
template <>
inline const bool compare_type(float, float)
{
return true;
}
template <>
inline const bool compare_type(double, double)
{
return true;
}
template <>
inline const bool compare_type(char, char)
{
return true;
}
template <>
inline const bool compare_type(wchar_t, wchar_t)
{
return true;
}
template <typename T1, typename T2>
inline const bool compare_type(T1*, T2*)
{
return compare_type(T1(), T2());
}
template <typename T1, typename T2>
inline const bool compare_type(const T1*, const T2*)
{
return compare_type(T1(), T2());
}
template <typename T1, typename T2>
inline const bool compare_type(const T1*, T2*)
{
return false;
}
template <typename T1, typename T2>
inline const bool compare_type(T1*, const T2*)
{
return false;
}
閫氳繃鐗逛緥鍖栵紝鎴戜滑鍙互寰堣交鏉劇殑鏌ョ湅涓や釜鍙橀噺鐨勭被鍨嬫槸鍚︾浉鍚屻?img src ="http://www.shnenglu.com/lwch/aggbug/188253.html" width = "1" height = "1" />
]]> - 灞卞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涓嬭澆
]]> - 灞卞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涓嬭澆
]]> - 灞卞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 == this) return *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涓嬭澆
]]> - 灞卞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/涓嬭澆
]]> - 灞卞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 <= 0) throw "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 <= 0) throw "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/涓嬭澆
]]> - 灞卞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
鏁版嵁緇撴瀯
- allocator
- 鍐呭瓨姹?/a>
- 鍐呭瓨姹燰2
- traits,construct&destruct
- vector
- list
- rbtree
- map&set
- hashtable
- hash_map&hash_set
綆楁硶

]]> 青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
欧美国产日韩一区|
久久精品国产精品亚洲综合|
亚洲国产高清自拍|
欧美一区二区三区视频免费|
国产欧美一区二区白浆黑人|
久久国产毛片|
可以免费看不卡的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重口味系列视频在线观看|
国产日韩欧美二区|
亚洲色在线视频|
亚洲电影免费观看高清完整版在线|
亚洲视频观看|
欧美日本不卡|
亚洲伦理精品|
久久尤物视频|
欧美亚洲系列|