锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 浠婂ぉ鐪嬩功鍒氬垰鐪嬬殑錛屽氨璁板綍涓嬫潵鍚с傝繖鍙兘鏄佺敓甯歌皥浜嗭紝鏉冧笖浣滀負涓涓閱掔殑渚嬪瓙鍚с?/p> 澶у閮界煡閬揝TL鏈変袱涓潪甯擱噸瑕佺殑緇勬垚閮ㄥ垎錛屽鍣ㄥ拰綆楁硶銆?/p> 綆楁硶灝辨槸涓涓釜鐨勫嚱鏁幫紝閫氳繃榪唬鍣ㄥ拰瀹瑰櫒鍏寵仈鍦ㄤ竴璧鳳紝瀹屾垚涓浜涘伐浣溿?/p> 綆楁硶鍜屽鍣ㄧ殑鍒嗙涓虹▼搴忚璁℃彁渚涗簡寰堝ぇ鐨勭伒媧繪э紝浣嗘槸涔熷甫鏉ヤ簡涓浜涜礋闈㈡晥鏋滐紝涓嬮潰鎴戣鐨勮繖涓棶棰樺氨鏄竴涓緥瀛愩?/p> STL鐨勭畻娉曢噷鏈変竴涓猺emove鍑芥暟錛岃宭ist鑷韓涔熸湁涓涓猺emove鍑芥暟錛屽姛鑳介兘鏄竴鏍風殑錛岀Щ闄ゆ煇涓涓厓绱狅紝閭f垜浠簲璇ヤ嬌鐢ㄥ摢涓涓憿錛?/p> 鐪嬩竴涓嬩笅闈㈣繖孌電▼搴?/p> 杈撳嚭鏄粈涔堝憿錛?/p> 絎竴琛岃偗瀹氭槸6 5 4 3 2 1 0 0 1 2 3 4 5 6錛岄偅涔堢浜岃浼氳緭鍑轟粈涔堬紵 濡傛灉鏄病鏈変粩緇嗙湅榪嘢TL鐨勪漢鑲畾浼氳涓簉emove(number.begin(), numbers.end(), 3)浼氱Щ闄ゆ墍鏈夊間負3鐨勫厓绱犮傛墍浠ヨ緭鍑烘槸錛? 5 4 2 1 0 0 1 2 4 5 6銆?/p> 浣嗘槸錛屾垜浠湅涓涓嬪畠鐪熸鐨勮緭鍑猴細 6 5 4 2 1 0 0 1 2 4 5 6 5 6 浣犲彲鑳戒細闈炲父鎯婅錛屼負浠涔堟渶鍚庝細澶氬嚭5鍜?涓や釜鏁板憿錛?/p> 鎴戜滑鏉ヨ涓涓媟emove綆楁硶鐨勫師鐞嗐?/p> remove綆楁硶宸ヤ綔鏃?strong>騫朵笉鏄洿鎺ユ妸鍏冪礌鍒犻櫎錛岃屾槸鐢ㄥ悗闈㈢殑鍏冪礌鏇夸唬鍓嶉潰鐨勫厓绱?/strong>錛屼篃鍗蟲槸璇村鏋滄垜瀵?234榪欎釜搴忓垪remove 2錛岃繑鍥炵殑搴忓垪鏄?1344錛?琚鍒跺埌2鐨勪綅緗紝4琚鍒跺埌3鐨勪綅緗級銆?/p> 榪欐牱涓婇潰鐨勪緥瀛愬氨濂借В閲婁簡錛岄偅涓や釜3鐨勫厓绱犲茍娌℃湁琚Щ闄わ紝鑰屾槸鐢ㄥ悗闈㈢殑鍏冪礌瑕嗙洊浜嗗墠闈㈢殑鍏冪礌銆傚鍑虹殑閭d袱涓暟娌℃湁琚Щ闄ゆ帀鑰屽凡銆?/p> 閭d箞鎴戜滑搴旇濡備綍鐪熸瀹屾垚縐婚櫎鍛紵remove鍑芥暟浼氳繑鍥炰竴涓凱浠e櫒錛岄偅涓凱浠e櫒鏄繖涓簭鍒楃殑閫昏緫緇堢偣錛屼篃鍗蟲槸鎴戜唬鐮侀噷鐨別ndOfNumbers錛屽畠鎸囧悜鍊掓暟絎簩涓?涓娿?/p> 浜庢槸鎴戜滑瑕佸埄鐢╨ist鐨別rase鍑芥暟瀹屾垚鍏冪礌縐婚櫎 榪欐牱鎴戜滑灝卞畬鎴愪簡鎴戜滑鐨勫伐浣滐紝紼嶇◢鏈夌偣鏇叉姌…… 鍏跺疄鎴戜滑鍙互鎶婅繖涓ゆ鏀懼湪涓璧鳳紝姣斿濡傛灉鎴戞兂鎺ョ潃縐婚櫎鎵鏈夊間負2鐨勫厓绱?/p> 榪欐牱鎴戜滑灝卞彲浠ヤ竴姝ュ埌浣嶄簡銆?/p> 浣嗘槸榪欐牱濂戒箞錛?/p> 涓嶅ソ銆?/p> 澶у浼氬彂鐜幫紝remove鍑芥暟鐨勫師鐞嗘槸澶嶅埗鑰屼笉鏄寚閽堢殑縐誨姩錛堝洜涓哄嚱鏁版搷綰電殑鏄凱浠e櫒錛岃孋++鐨勮凱浠e櫒娌℃湁瀹氫箟鍒犻櫎鎿嶄綔錛夛紝榪欐牱浼氬甫鏉ヤ竴涓棶棰橈細鎴戜滑浣跨敤list鏄洜涓哄畠鐨勪慨鏀圭殑鏁堢巼闈炲父楂橈紝鏀瑰彉涓涓嬫寚閽堝氨鍙互浜嗐傝岃繖閲屾垜浠鍒朵簡鍏冪礌錛屽鏋滃湪vector涓紝鍙兘榪樻槸楂樻晥鐨勶紝鍥犱負vector鏃犺濡備綍閮借澶嶅埗錛岃屽浜巐ist灝變笉鏄姝や簡錛?strong>浼氭瀬搴﹂檷浣庢垜浠殑鏁堢巼銆?/strong> 閭f垜浠庝箞鍔炲憿錛?/p> 絳旀鏄嬌鐢╨ist鑷繁鐨剅emove鍑芥暟 鎴戜滑鍙互榪欐牱鍒犻櫎鎵鏈夊間負1鐨勫厓绱犮?/p> 涔熷嵆鏄錛屽鏋滆鍒犻櫎list涓殑鍏冪礌錛?strong>鎴戜滑搴旇浣跨敤list鐨剅emove鎴愬憳鍑芥暟錛岃屼笉鏄痳emove綆楁硶錛?/p> 灝忕粨 鎴戜滑閮界煡閬擄紝STL鏄竴涓晥鐜囥佸鐢ㄦс佺伒媧繪ф姌琛風殑浜х墿錛屽叾涓晥鐜囪嚦鍏抽噸瑕侊紝鎵浠TL宸茬粡紱佹浜嗕竴浜涙晥鐜囦綆鐨勬搷浣滐紙姣斿list鐨勯殢鏈鴻闂級錛岃岄紦鍔變綘鍘諱嬌鐢ㄥ叾瀹冪殑瀹瑰櫒銆?/p> 浣嗘槸錛?strong>鍦ㄧ畻娉曚腑錛屼負浜嗙伒媧繪э紝STL榪樻槸浼氱壓鐗蹭竴浜涗笢瑗?/strong>錛屾瘮濡傛垜浠繖涓緥瀛愩?/p> 涓漢瑙夊緱錛孲TL浣滀負C++鏍囧噯搴撶殑涓涓粍鎴愰儴鍒嗭紝鐗圭偣鍜孋++鏈韓涓妯′竴鏍鳳紝寮哄ぇ鑰屽鏉傦紝鏈変簺鍦版柟闅句互鐞嗚В錛屽緢澶氱粏鑺傞渶瑕佸涔犳敞鎰忥紝鎴戜滑瑕佸浼氶伩鍏嶉櫡鍏ユ煇浜涢櫡闃變箣涓紝姣斿榪欎釜渚嬪瓙灝辨槸涓涓晥鐜囬櫡闃便?/p> 鍏跺畠鏇村鐨勯櫡闃辨槸閿欒澶勭悊鏂歸潰鐨勶紝STL鏈韓騫舵病鏈夎瀹氳繃澶氱殑閿欒澶勭悊錛屽ぇ閮ㄥ垎鐨勯敊璇鐞嗛兘浜ょ粰浜嗘垜浠紝鐞嗙敱寰堢畝鍗曪細鎬ц兘鑷充笂錛屽鏋滀竴涓笢瑗胯嚜韜病鏈夐敊璇鏌ワ紝鎴戜滑鍙互鍖呰涓涓甫閿欒媯鏌ョ殑綾伙紱浣嗘槸濡傛灉榪欎釜涓滆タ鑷韓灝卞甫浜嗛敊璇鏌ワ紝閭d箞鎴戜滑灝辨病鏈変換浣曟柟娉曟彁鍗囧畠鐨勬晥鐜囦簡銆傝繖涔熸槸寰堝C鍜孋++搴撶殑璁捐鍘熷垯銆?/p> 鎵浠ワ紝寰堝鏃跺欙紝闇瑕佹垜浠繁鍏ョ粏鑺?/strong>錛岀劧鍚庡啀鍐沖畾鍒板簳鎬庝箞鍋氥傚洜涓篊++灝辨槸濡傛錛氭湁寰堝璺彲浠ヨ蛋錛岄渶瑕佹垜浠嚜宸遍夋嫨鏈濂界殑涓鏉¤礬銆?/p> 鍦?C++ 涓渶瑕佽嚜宸辨潵澶勭悊鍐呭瓨錛岀◢寰鐞嗕笉褰擄紝灝變細瀛樺湪闈炲父閮侀椃鐨勫唴瀛樻硠婕忛棶棰? 榪樺ソ錛岀幇鍦?C++ 涓帹鍑轟簡寮哄ぇ鐨勬櫤鑳芥寚閽堬紝鍗?smart_ptr 錛屾湰鏂囧厛紼嶅井浠嬬粛涓涓?smart_ptr 錛岀劧鍚庡叿浣撹璇?shared_ptr 鍜?weak_ptr 錛岀壒鍒槸 enable_shared_from_this 鍜?shared_from_this 闄や簡鏍囧噯搴撲腑鐨?auto_ptr 涔嬪 鍦?boost 鎴栬?tr1 涓殑 smart_ptr 涓昏鏄湁涓嬮潰鍑犵 榪欎簺閲岄潰鏈闅劇悊瑙g殑鏄患鍚堝簲鐢ㄤ簡 weak_ptr 鍜?shared_ptr 鐨?enable_shared_from_this 綾伙紝鍦ㄨ綾諱腑瀹氫簡鎴愬憳鍑芥暟 shared_from_this() 錛岃繑鍥?shared_ptr<T> 銆傝繖涓嚱鏁頒粎鍦?shared_ptr<T> 鐨勬瀯閫犲嚱鏁拌璋冪敤涔嬪悗鎵嶈兘浣跨敤銆傚師鍥犳槸 enable_shared_from_this::weak_ptr 騫朵笉鍦ㄦ瀯閫犲嚱鏁頒腑璁劇疆錛堟澶勭殑鏋勯犲嚱鏁版寚鐨勬槸綾誨瀷 T 鐨勬瀯閫犲嚱鏁幫級錛岃屾槸鍦?shared_ptr<T> 鐨勬瀯閫犲嚱鏁頒腑璁劇疆錛堟澶勭殑鏋勯犲嚱鏁版寚鐨勬槸綾誨瀷 shared_ptr<T> 鐨勬瀯閫犲嚱鏁幫級銆? 鍦ㄤ笅闈㈢殑浠g爜涓細 鑻ヤ笉浣跨敤 shared_from_this() 鎴愬憳鍑芥暟錛屽垯浼氳緭鍑?a 鍜?b 鐨?use_count() 閮戒負 1 錛岀劧鍚庤皟鐢?2 嬈$被鍨?Ansible 鐨勬瀽鏋勫嚱鏁幫紝鑻ユ坊鍔犱簡璇ユ垚鍛樺嚱鏁幫紝鍦?a 鍜?b 鐨?use_count() 杈撳嚭涓?2 錛屽彧鏄皟鐢ㄤ竴嬈?Ansible 鐨勬瀽鏋勫嚱鏁般傚師鍥犳槸 enable_shared_from_this 閲岄潰鍦?shared_ptr<T> 鐨勬椂鍊欐瀯閫犱簡涓涓?weak_ptr 綾伙紝鑰?weak_ptr 鍙槸鐩戣錛屼笉澧炲姞寮曠敤璁℃暟 錛堜笅闈㈡槸杞澆錛?http://huyuguang1976.spaces.live.com/blog/cns!2A9E272E3C33AFF1!185.entry 錛? 鎵浠ュ涓嬩唬鐮佹槸閿欒鐨勶細 class D:public boost::enable_shared_from_this<D> { public: D() { boost::shared_ptr<D> p=shared_from_this(); } }; 鍘熷洜寰堢畝鍗曪紝鍦?D 鐨勬瀯閫犲嚱鏁頒腑铏界劧鍙互淇濊瘉 enable_shared_from_this<D> 鐨勬瀯閫犲嚱鏁板凡緇忚璋冪敤錛屼絾姝e鍓嶉潰鎵璇達紝 weak_ptr 榪樻病鏈夎緗? 濡備笅浠g爜涔熸槸閿欒鐨勶細 class D:public boost::enable_shared_from_this<D> { public: void func() { boost::shared_ptr<D> p=shared_from_this(); } }; void main() { D d; d.func(); } 閿欒鍘熷洜鍚屼笂銆? 濡備笅浠g爜鏄紜殑錛? void main() { boost::shared_ptr<D> d(new D); d->func(); } 榪欓噷 boost::shared_ptr<D> d(new D) 瀹為檯涓婃墽琛屼簡 3 涓姩浣滐細棣栧厛璋冪敤 enable_shared_from_this<D> 鐨勬瀯閫犲嚱鏁幫紱鍏舵璋冪敤 D 鐨勬瀯閫犲嚱鏁幫紱鏈鍚庤皟鐢?shared_ptr<D> 鐨勬瀯閫犲嚱鏁般傛槸絎?3 涓姩浣滆緗簡 enable_shared_from_this<D> 鐨?weak_ptr 錛岃屼笉鏄 1 涓姩浣溿傝繖涓湴鏂規槸寰堣繚鑳?c++ 甯哥悊鍜岄昏緫鐨勶紝蹇呴』灝忓績銆? 緇撹鏄紝涓嶈鍦ㄦ瀯閫犲嚱鏁頒腑浣跨敤 shared_from_this 錛涘叾嬈★紝濡傛灉瑕佷嬌鐢?shared_ptr 錛屽垯搴旇鍦ㄦ墍鏈夊湴鏂瑰潎浣跨敤錛屼笉鑳戒嬌鐢?D d 榪欑鏂瑰紡錛屼篃鍐充笉瑕佷紶閫掕8鎸囬拡銆?br /> { boost::shared_ptr<X> getX() { boost::shared_ptr<X> r ;//????濡備綍瀹炵幇 return r; } }; 瑕佸緱鍒癤鐨勬櫤鑳芥寚閽?鍙槸鍦ㄥ璞℃寚閽堟槸鍙梥hared_ptr淇濇姢鐨勫熀紜涓婄殑,涓句緥濡備笅: void test_X() { { X x; boost::shared_ptr<X> px = x.getX();//閿欒 } { X* x = new X(); boost::shared_ptr<X> px = x->getX();//閿欒 } { boost::shared_ptr<X> x (new X()); boost::shared_ptr<X> px = x->getX();//姝g‘ } } 1 list<int> numbers; 2 3 for ( int number = 0; number <= 6; number ++ ) { 4 numbers.push_front(number); 5 numbers.push_back(number); 6 } 7 8 copy(numbers.begin(), numbers.end(), 9 ostream_iterator<int>(cout, " ")); 10 cout << endl; 11 12 // remove algorithm will remove element but not erase the element from container 13 // it will return the logical desination of container 14 list<int>::iterator endOfNumbers = remove(numbers.begin(), numbers.end(), 3); 15 16 copy(numbers.begin(), numbers.end(), 17 ostream_iterator<int>(cout, " ")); 18 cout << endl;
numbers.erase(endOfNumbers, numbers.end());
numbers.erase(remove(numbers.begin(), numbers.end(), 2), numbers.end());numbers.remove(1);
]]>
濡備笅浠g爜鏄敊璇殑錛?
濡備笅浠g爜涔熸槸閿欒鐨勶細
濡備笅浠g爜鏄紜殑錛?
緇撹鏄紝涓嶈鍦ㄦ瀯閫犲嚱鏁頒腑浣跨敤shared_from_this錛涘叾嬈★紝濡傛灉瑕佷嬌鐢╯hared_ptr錛屽垯搴旇 鍦ㄦ墍鏈夊湴鏂瑰潎浣跨敤錛屼笉鑳戒嬌鐢― d榪欑鏂瑰紡錛屼篃鍐充笉瑕佷紶閫掕8鎸囬拡銆?
鍙︿竴涓煎緱娉ㄦ剰鐨勫湴鏂規槸鍦ㄧ被鐨勭戶鎵挎爲涓笉鑳芥湁2涓垨鏇村涓猠nable_shared_from_this<T>銆備緥濡傚涓嬩唬鐮佹槸閿欒鐨勶細
class B:public boost::enable_shared_from_this<B>,public A錛?
鍒欎粎璁劇疆enable_shared_from_this<B>鐨剋eak_ptr銆傚緢鏄庢樉閮芥槸閿欒鐨勩?
閭d箞enable_shared_from_this浠ュ強shared_ptr涓轟綍瑕佸姝ゅ疄鐜板憿錛熷張涓轟粈涔堜細鏈夊姝ゆ紓鐨勭粨鏋滃憿錛?
棣栧厛鑰冨療shared_ptr鐨勬瀯閫犲嚱鏁幫細
閭d箞姝g‘鐨勮В娉曟槸鎬庢牱鐨勫憿錛?
鍏充簬涓轟粈涔坋nable_shared_from_this鏄繖鏍峰疄鐜扮殑錛屽彲浠ュ弬鐪嬩綔鑰呭師鏂囷細
Every enable_shared_from_this base contains a weak_ptr, The shared_ptr constructor looks up the enable_shared_from_this base and initializes its weak_ptr accordingly. This doesn't work when there are
two or more enable_shared_from_this bases, though.
I could put the weak_ptr in a virtual polymorphic base. This would force polymorphism on all clients of enable_shared_from_this... probably acceptable. It will also force a dynamic_pointer_cast in every
shared_from_this, and this may be harder to swallow, particularly in cases where RTTI is off. So I'm not sure.
If you do want the above behavior, it's easy to duplicate, as I already responded in my first post on the topic. Just make FooB return dynamic_pointer_cast<B>( FooA() ) and remove the enable_shared_from_this<B>
base (A needs to be made polymorphic, of course).
娉ㄦ剰涓轟簡璁ヾynamic_pointer_cast鑳藉伐浣滐紝A蹇呴』鍏鋒湁铏氬嚱鏁幫紝閭d箞鏈綆鍗曠殑鍋氭硶褰撶劧鏄護鍏舵瀽鏋勫嚱 鏁頒負铏氬嚱鏁幫紙閫氬父涓涓猚lass濡傛灉甯屾湜琚戶鎵匡紝鏋愭瀯鍑芥暟灝卞簲璇ヤ負铏氬嚱鏁幫級銆?/div>
]]>#include <iostream> #include <string> #include <boost/shared_ptr.hpp> #include <boost/weak_ptr.hpp> #include <boost/enable_shared_from_this.hpp> using namespace std; struct Ansible : public boost::enable_shared_from_this<Ansible> { boost::shared_ptr<Ansible> get_shared() { boost::shared_ptr<Ansible> r(this); return r; } ~Ansible() { cout<<"Destructor"<<endl; } }; int main(int argc,char* argv[]) { boost::shared_ptr<Ansible> a(new Ansible); Ansible& r = *a; //boost::shared_ptr<Ansible> b = r.get_shared(); boost::shared_ptr<Ansible> b = r.shared_from_this(); cout<<"Reference Number "<<a.use_count()<<" "<<b.use_count()<<endl; return 0; }
鍙﹁В錛氾細錛氾細錛?br />struct X
]]>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
int fun1()
{
for(int i=0; i<10; i++)
printf("鍝堝搱鍝堝搱鍝堝搱\n");
return 0;
}
int fun2(int count)
{
for(int i=0; i<count; i++)
printf("鍛靛懙鍛靛懙鍛靛懙\n");
return 0;
}
int main()
{
boost::thread(fun1); // 涓嶄互鎵撳嵃
boost::thread(fun2, 10); // 鍙互鎵撳嵃
boost::thread t(fun1); // 鍙互鎵撳嵃
getchar();
return 0;
}
]]>