浣犺瀵繪壘浠涔堬紝鑰屼笖浣犳湁涓涓鍣ㄦ垨鑰呬綘鏈変竴涓敱榪唬鍣ㄥ垝鍒嗗嚭鏉ョ殑鍖洪棿鈥斺斾綘瑕佹壘鐨勪笢瑗垮氨鍦ㄩ噷闈€備綘瑕佹庝箞瀹屾垚鎼滅儲鍛紵浣犵琚嬩腑鐨勭鏈夎繖浜涳細count銆乧ount_if銆乫ind銆乫ind_if銆乥inary_search銆乴ower_bound銆乽pper_bound鍜宔qual_range銆傞潰瀵圭潃瀹冧滑錛屼綘瑕佹庝箞鍋氬嚭閫夋嫨錛?/p>
綆鍗曘備綘瀵繪壘鐨勬槸鑳藉張蹇張綆鍗曠殑涓滆タ銆傝秺蹇秺綆鍗曠殑瓚婂ソ銆?/p>
鏆傛椂錛屾垜鍋囪浣犳湁涓瀵規寚瀹氫簡鎼滅儲鍖洪棿鐨勮凱浠e櫒銆傜劧鍚庯紝鎴戜細鑰冭檻鍒頒綘鏈夌殑鏄竴涓鍣ㄨ屼笉鏄竴涓尯闂寸殑鎯呭喌銆?/p>
瑕侀夋嫨鎼滅儲絳栫暐錛屽繀欏諱緷璧栦簬浣犵殑榪唬鍣ㄦ槸鍚﹀畾涔変簡涓涓湁搴忓尯闂淬傚鏋滄槸錛屼綘灝卞彲浠ラ氳繃binary_search銆乴ower_bound銆乽pper_bound鍜宔qual_range鏉ュ姞閫燂紙閫氬父鏄鏁版椂闂粹斺斿弬瑙?a >鏉℃34錛夋悳绱€傚鏋滆凱浠e櫒騫舵病鏈夊垝鍒嗕竴涓湁搴忓尯闂達紝浣犲氨鍙兘鐢ㄧ嚎鎬ф椂闂寸殑綆楁硶count銆乧ount_if銆乫ind鍜宖ind_if銆傚湪涓嬫枃涓紝鎴戜細蹇界暐鎺塩ount鍜宖ind鏄惁鏈塤if鐨勪笉鍚岋紝灝卞儚鎴戜細蹇界暐鎺塨inary_search銆乴ower_bound銆乽pper_bound鍜宔qual_range鏄惁甯︽湁鍒ゆ柇寮忕殑涓嶅悓銆備綘鏄緷璧栭粯璁ょ殑鎼滅儲璋撹瘝榪樻槸鎸囧畾涓涓嚜宸辯殑錛屽閫夋嫨鎼滅儲綆楁硶鐨勮冭檻鏄竴鏍風殑銆?/p>
濡傛灉浣犳湁涓涓棤搴忓尯闂達紝浣犵殑閫夋嫨鏄痗ount鎴栫潃find銆傚畠浠垎鍒彲浠ュ洖絳旂暐寰笉鍚岀殑闂錛屾墍浠ュ煎緱浠旂粏鍘誨尯鍒嗗畠浠俢ount鍥炵瓟鐨勯棶棰樻槸錛?#8220;鏄惁瀛樺湪榪欎釜鍊鹼紝濡傛灉鏈夛紝閭d箞瀛樺湪鍑犱喚鎷瘋礉錛?#8221;鑰宖ind鍥炵瓟鐨勯棶棰樻槸錛?#8220;鏄惁瀛樺湪錛屽鏋滄湁錛岄偅涔堝畠鍦ㄥ摢鍎匡紵”
鍋囪浣犳兂鐭ラ亾鐨勪笢瑗挎槸錛屾槸鍚︽湁涓涓壒瀹氱殑Widget鍊紈鍦╨ist涓傚鏋滅敤count錛屼唬鐮佺湅璧鋒潵鍍忚繖鏍鳳細
list<Widget> lw; // Widget鐨刲ist Widget w; // 鐗瑰畾鐨刉idget鍊? ... if (count(lw.begin(), lw.end(), w)) { ... // w鍦╨w涓? } else { ... // 涓嶅湪 }
榪欓噷紺鴻寖浜嗕竴縐嶆儻鐢ㄦ硶錛氭妸count鐢ㄦ潵浣滀負鏄惁瀛樺湪鐨勬鏌ャ俢ount榪斿洖闆舵垨鑰呬竴涓鏁幫紝鎵浠ユ垜浠妸闈為浂杞寲涓簍rue鑰屾妸闆惰漿鍖栦負false銆傚鏋滆繖鏍瘋兘浣挎垜浠鍋氱殑鏇村姞鏄捐屾槗瑙侊細
if (count(lw.begin(), lw.end(), w) != 0) ...
鑰屼笖鏈変簺紼嬪簭鍛樿繖鏍峰啓錛屼絾鏄嬌鐢ㄩ殣寮忚漿鎹㈠垯鏇村父瑙侊紝灝卞儚鏈鍒濈殑渚嬪瓙銆?/p>
鍜屾渶鍒濈殑浠g爜姣旇緝錛屼嬌鐢╢ind鐣ュ井鏇撮毦鎳備簺錛屽洜涓轟綘蹇呴』媯鏌ind鐨勮繑鍥炲煎拰list鐨別nd榪唬鍣ㄦ槸鍚︾浉絳夛細
if (find(lw.begin(), lw.end(), w) != lw.end()) { ... // 鎵懼埌浜? } else { ... // 娌℃壘鍒? }
濡傛灉鏄負浜嗘鏌ユ槸鍚﹀瓨鍦紝count榪欎釜鎯敤娉曠紪鐮佽搗鏉ユ瘮杈冪畝鍗曘備絾鏄紝褰撴悳绱㈡垚鍔熸椂錛屽畠鐨勬晥鐜囨瘮杈冧綆錛屽洜涓哄綋鎵懼埌鍖歸厤鐨勫煎悗find灝卞仠姝簡錛岃宑ount蹇呴』緇х畫鎼滅儲錛岀洿鍒板尯闂寸殑緇撳熬浠ュ鎵懼叾浠栧尮閰嶇殑鍊箋傚澶у鏁扮▼搴忓憳鏉ヨ錛宖ind鍦ㄦ晥鐜囦笂鐨勪紭鍔胯凍浠ヨ瘉鏄庣暐寰鍔犲鏉傚害鏄悎閫傜殑銆?/p>
閫氬父錛屽彧鐭ラ亾鍖洪棿鍐呮槸鍚︽湁鏌愪釜鍊兼槸涓嶅鐨勩傚彇鑰屼唬涔嬬殑鏄紝浣犳兂鑾峰緱鍖洪棿涓殑絎竴涓瓑浜庤鍊肩殑瀵硅薄銆傛瘮濡傦紝浣犲彲鑳芥兂鎵撳嵃鍑鴻繖涓璞★紝浣犲彲鑳芥兂鍦ㄥ畠鍓嶉潰鎻掑叆浠涔堬紝鎴栬呬綘鍙兘鎯寵鍒犻櫎瀹冿紙浣嗗綋榪唬鏃跺垹闄ょ殑寮曞鍙傝鏉℃9錛夈傚綋浣犻渶瑕佺煡閬撶殑涓嶆鏄煇涓兼槸鍚﹀瓨鍦紝鑰屼笖瑕佺煡閬撳摢涓璞★紙鎴栧摢浜涘璞★級鎷ユ湁璇ュ鹼紝浣犲氨寰楃敤find錛?/p>
list<Widget>::iterator i = find(lw.begin(), lw.end(), w); if (i != lw.end()) { ... // 鎵懼埌浜嗭紝i鎸囧悜絎竴涓? } else { ... // 娌℃湁鎵懼埌 }
瀵逛簬鏈夊簭鍖洪棿錛屼綘鏈夊叾浠栫殑閫夋嫨錛岃屼笖浣犲簲璇ユ槑紜殑浣跨敤瀹冧滑銆俢ount鍜宖ind鏄嚎鎬ф椂闂寸殑錛屼絾鏈夊簭鍖洪棿鐨勬悳绱㈢畻娉曪紙binary_search銆乴ower_bound銆乽pper_bound鍜宔qual_range錛夋槸瀵規暟鏃墮棿鐨勩?/p>
浠庢棤搴忓尯闂磋縼縐誨埌鏈夊簭鍖洪棿瀵艱嚧浜嗗彟涓涓縼縐伙細浠庝嬌鐢ㄧ浉絳夋潵鍒ゆ柇涓や釜鍊兼槸鍚︾浉鍚屽埌浣跨敤絳変環鏉ュ垽鏂?a >鏉℃19鐢變竴涓緇嗗湴璁茶堪浜嗙浉絳夊拰絳変環鐨勫尯鍒紝鎵浠ユ垜鍦ㄨ繖閲屼笉浼氶噸澶嶃傚彇鑰屼唬涔嬬殑鏄紝鎴戜細綆鍗曞湴璇存槑count鍜宖ind綆楁硶閮界敤鐩哥瓑鏉ユ悳绱紝鑰宐inary_search銆乴ower_bound銆乽pper_bound鍜宔qual_range鍒欑敤絳変環銆?/p>
瑕佹祴璇曞湪鏈夊簭鍖洪棿涓槸鍚﹀瓨鍦ㄤ竴涓鹼紝浣跨敤binary_search銆備笉鍍忔爣鍑咰搴撲腑鐨勶紙鍥犳涔熸槸鏍囧噯C++搴撲腑鐨勶級bsearch錛宐inary_search鍙繑鍥炰竴涓猙ool錛氳繖涓兼槸鍚︽壘鍒頒簡銆俠inary_search鍥炵瓟榪欎釜闂錛?#8220;瀹冨湪鍚楋紵”瀹冪殑鍥炵瓟鍙兘鏄槸鎴栬呭惁銆傚鏋滀綘闇瑕佹瘮榪欐牱鏇村鐨勪俊鎭紝浣犻渶瑕佷竴涓笉鍚岀殑綆楁硶銆?/p>
榪欓噷鏈変竴涓猙inary_search搴旂敤浜庢湁搴弙ector鐨勪緥瀛愶紙浣犲彲浠ヤ粠鏉℃23涓煡閬撴湁搴弙ector鐨勪紭鐐癸級錛?/p>
vector<Widget> vw; // 寤虹珛vector錛屾斁鍏?
... // 鏁版嵁錛?
sort(vw.begin(), vw.end()); // 鎶婃暟鎹帓搴?
Widget w; // 瑕佹壘鐨勫?
...
if (binary_search(vw.begin(), vw.end(), w)) {
... // w鍦╲w涓?
} else {
... // 涓嶅湪
}
濡傛灉浣犳湁涓涓湁搴忓尯闂磋屼笖浣犵殑闂鏄細“瀹冨湪鍚楋紝濡傛灉鏄紝閭d箞鍦ㄥ摢鍎匡紵”浣犲氨闇瑕乪qual_range錛屼絾浣犲彲鑳芥兂瑕佺敤lower_bound銆傛垜浼氬緢蹇璁篹qual_range錛屼絾棣栧厛錛岃鎴戜滑鐪嬬湅鎬庝箞鐢╨ower_bound鏉ュ湪鍖洪棿涓畾浣嶆煇涓箋?/p>
褰撲綘鐢╨ower_bound鏉ュ鎵句竴涓肩殑鏃跺欙紝瀹冭繑鍥炰竴涓凱浠e櫒錛岃繖涓凱浠e櫒鎸囧悜榪欎釜鍊肩殑絎竴涓嫹璐濓紙濡傛灉鎵懼埌鐨勮瘽錛夋垨鑰呭埌鍙互鎻掑叆榪欎釜鍊肩殑浣嶇疆錛堝鏋滄病鎵懼埌錛夈傚洜姝ower_bound鍥炵瓟榪欎釜闂錛?#8220;瀹冨湪鍚楋紵濡傛灉鏄紝絎竴涓嫹璐濆湪鍝噷錛熷鏋滀笉鏄紝瀹冨皢鍦ㄥ摢閲岋紵”鍜宖ind涓鏍鳳紝浣犲繀欏繪祴璇昹ower_bound鐨勭粨鏋滐紝鏉ョ湅鐪嬪畠鏄惁鎸囧悜浣犺瀵繪壘鐨勫箋備絾鍙堜笉鍍廸ind錛屼綘涓嶈兘鍙槸媯嫻媗ower_bound鐨勮繑鍥炲兼槸鍚︾瓑浜巈nd榪唬鍣ㄣ傚彇鑰屼唬涔嬬殑鏄紝浣犲繀欏繪嫻媗ower_bound鎵鏍囩ず鍑虹殑瀵硅薄鏄笉鏄綘闇瑕佺殑鍊箋?/p>
寰堝紼嬪簭鍛樿繖涔堢敤lower_bound錛?/p>
vector<Widget>::iterator i = lower_bound(vw.begin(), vw.end(), w); if (i != vw.end() && *i == w) { // 淇濊瘉i鎸囧悜涓涓璞★紱 // 涔熷氨淇濊瘉浜嗚繖涓璞℃湁姝g‘鐨勫箋? // 榪欐槸涓猙ug錛? ... // 鎵懼埌榪欎釜鍊鹼紝i鎸囧悜 // 絎竴涓瓑浜庤鍊肩殑瀵硅薄 } else { ... // 娌℃壘鍒? }
澶ч儴鍒嗘儏鍐典笅榪欐槸琛屽緱閫氱殑錛屼絾涓嶆槸鐪熺殑瀹屽叏姝g‘銆傚啀鐪嬩竴閬嶆嫻嬮渶瑕佺殑鍊兼槸鍚︽壘鍒扮殑浠g爜錛?/p>
if (i != vw.end() && *i == w) ...
榪欐槸涓涓?em>鐩哥瓑鐨勬祴璇曪紝浣唋ower_bound鎼滅儲鐢ㄧ殑鏄?em>絳変環銆傚ぇ閮ㄥ垎鎯呭喌涓嬶紝絳変環嫻嬭瘯鍜岀浉絳夋祴璇曚駭鐢熺殑緇撴灉鐩稿悓錛屼絾灝卞儚鏉℃19璁鴻瘉鐨勶紝鐩哥瓑鍜岀瓑浠風殑緇撴灉涓嶅悓鐨勬儏鍐靛茍涓嶉毦瑙佸埌銆傚湪榪欑鎯呭喌涓嬶紝涓婇潰鐨勪唬鐮佸氨鏄敊鐨勩?/p>
瑕佸畬鍏ㄥ畬鎴愶紝浣犲氨蹇呴』媯嫻媗ower_bound榪斿洖鐨勮凱浠e櫒鎸囧悜鐨勫璞$殑鍊兼槸鍚﹀拰浣犺瀵繪壘鐨勫肩瓑浠楓備綘鍙互鎵嬪姩瀹屾垚錛?a >鏉℃19婕旂ず浜嗕綘璇ユ庝箞鍋氾紝褰撳畠鍊煎緱涓鍋氭椂鏉℃24鎻愪緵浜嗕竴涓緥瀛愶級錛屼絾鍙互鏇寸嫛鐚懼湴瀹屾垚錛屽洜涓轟綘蹇呴』紜浣跨敤浜嗗拰lower_bound浣跨敤鐨勭浉鍚岀殑姣旇緝鍑芥暟銆備竴鑸岃█錛岄偅鍙互鏄竴涓換鎰忕殑鍑芥暟錛堟垨鍑芥暟瀵硅薄錛夈傚鏋滀綘浼犻掍竴涓瘮杈冨嚱鏁扮粰lower_bound錛屼綘蹇呴』紜鍜屼綘鐨勬墜鍐欑殑絳変環媯嫻嬩唬鐮佷嬌鐢ㄤ簡鐩稿悓鐨勬瘮杈冨嚱鏁般傝繖鎰忓懗鐫濡傛灉浣犳敼鍙樹簡浣犱紶閫掔粰lower_bound鐨勬瘮杈冨嚱鏁幫紝浣犱篃寰楀浣犵殑絳変環媯嫻嬮儴鍒嗕綔鍑轟慨鏀廣備繚鎸佹瘮杈冨嚱鏁板悓姝ヤ笉鏄伀綆彂灝勶紝浣嗗嵈鏄彟涓涓璁頒綇鐨勪笢瑗匡紝鑰屼笖鎴戞兂浣犲凡緇忔湁寰堝闇瑕佷綘璁扮殑涓滆タ浜嗐?/p>
榪欏効鏈変竴涓畝鍗曠殑鏂規硶錛氫嬌鐢╡qual_range銆俥qual_range榪斿洖涓瀵硅凱浠e櫒錛岀涓涓瓑浜巐ower_bound榪斿洖鐨勮凱浠e櫒錛岀浜屼釜絳変簬upper_bound榪斿洖鐨勶紙涔熷氨鏄紝絳変環浜庤鎼滅儲鍊煎尯闂寸殑鏈凱浠e櫒鐨勪笅涓涓級銆傚洜姝わ紝equal_range錛岃繑鍥炰簡涓瀵瑰垝鍒嗗嚭浜嗗拰浣犺鎼滅儲鐨勫肩瓑浠風殑鍖洪棿鐨勮凱浠e櫒銆備竴涓悕瀛楀緢濂界殑綆楁硶錛屼笉鏄悧錛燂紙褰撶劧錛屼篃璁稿彨equivalent_range浼氭洿濂斤紝浣嗗彨equal_range涔熼潪甯稿ソ銆傦級
瀵逛簬equal_range鐨勮繑鍥炲鹼紝鏈変袱涓噸瑕佺殑鍦版柟銆傜涓錛屽鏋滆繖涓や釜榪唬鍣ㄧ浉鍚岋紝灝辨剰鍛崇潃瀵硅薄鐨勫尯闂存槸絀虹殑錛涜繖涓彧娌℃湁鎵懼埌銆傝繖涓粨鏋滄槸鐢╡qual_range鏉ュ洖絳?#8220;瀹冨湪鍚楋紵”榪欎釜闂鐨勭瓟妗堛備綘鍙互榪欎箞鐢細
vector<Widget> vw; ... sort(vw.begin(), vw.end()); typedef vector<Widget>::iterator VWIter; // 鏂逛究鐨則ypedef typedef pair<VWIter, VWIter> VWIterPair; VWIterPair p = equal_range(vw.begin(), vw.end(), w); if (p.first != p.second) { // 濡傛灉equal_range涓嶈繑鍥? // 絀虹殑鍖洪棿... ... // 璇存槑鎵懼埌浜嗭紝p.first鎸囧悜 // 絎竴涓宲.second // 鎸囧悜鏈鍚庝竴涓殑涓嬩竴涓? } else { ... // 娌℃壘鍒幫紝p.first鍜? // p.second閮芥寚鍚戞悳绱㈠? } // 鐨勬彃鍏ヤ綅緗?
榪欐浠g爜鍙敤絳変環錛屾墍浠ユ繪槸姝g‘鐨勩?/p>
絎簩涓娉ㄦ剰鐨勬槸equal_range榪斿洖鐨勪笢瑗挎槸涓や釜榪唬鍣紝瀵瑰畠浠綔distance灝辯瓑浜庡尯闂翠腑瀵硅薄鐨勬暟鐩紝涔熷氨鏄紝絳変環浜庤瀵繪壘鐨勫肩殑瀵硅薄銆傜粨鏋滐紝equal_range涓嶅厜瀹屾垚浜嗘悳绱㈡湁搴忓尯闂寸殑浠誨姟錛岃屼笖瀹屾垚浜嗚鏁般傛瘮濡傝錛岃鍦╲w涓壘鍒扮瓑浠蜂簬w鐨刉idget錛岀劧鍚庢墦鍗板嚭鏉ユ湁澶氬皯榪欐牱鐨刉idget瀛樺湪錛屼綘鍙互榪欎箞鍋氾細
VWIterPair p = equal_range(vw.begin(), vw.end(), w);
cout << "There are " << distance(p.first, p.second)
<< " elements in vw equivalent to w.";
鍒扮洰鍓嶄負姝紝鎴戜滑鎵璁ㄨ鐨勯兘鏄亣璁炬垜浠鍦ㄤ竴涓尯闂村唴鎼滅儲涓涓鹼紝浣嗘槸鏈夋椂鍊欐垜浠洿鎰熷叴瓚d簬鍦ㄥ尯闂翠腑瀵繪壘涓涓綅緗傛瘮濡傦紝鍋囪鎴戜滑鏈変竴涓猅imestamp綾誨拰涓涓猅imestamp鐨剉ector錛屽畠鎸夌収鑰佺殑timestamp鏀懼湪鍓嶉潰鐨勬柟娉曟帓搴忥細
class Timestamp { ... }; bool operator<(const Timestamp& lhs, // 榪斿洖鍦ㄦ椂闂翠笂lhs const Timestamp& rhs); // 鏄惁鍦╮hs鍓嶉潰 vector<Timestamp> vt; // 寤虹珛vector錛屽~鍏呮暟鎹紝 ... // 鎺掑簭錛屼嬌鑰佺殑鏃墮棿 sort(vt.begin(), vt.end()); // 鍦ㄦ柊鐨勫墠闈?
鐜板湪鍋囪鎴戜滑鏈変竴涓壒孌婄殑timestamp鈥斺攁geLimit錛岃屼笖鎴戜滑浠巚t涓垹闄ゆ墍鏈夋瘮ageLimit鑰佺殑timestamp銆傚湪榪欑鎯呭喌涓嬶紝鎴戜滑涓嶉渶瑕佸湪vt涓悳绱㈠拰ageLimit絳変環鐨凾imestamp錛屽洜涓哄彲鑳戒笉瀛樺湪浠諱綍絳変環浜庤繖涓簿紜肩殑鍏冪礌銆?鍙栬屼唬涔嬬殑鏄紝鎴戜滑闇瑕佸湪vt涓壘鍒頒竴涓綅緗細絎竴涓笉姣攁geLimit鏇磋佺殑鍏冪礌銆傝繖鏄啀綆鍗曚笉榪囩殑浜嗭紝鍥犱負lower_bound浼氱粰鎴戜滑絳旀鐨勶細
Timestamp ageLimit;
...
vt.erase(vt.begin(), lower_bound(vt.begin(), // 浠巚t涓帓闄ゆ墍鏈?
vt.end(), // 鎺掑湪ageLimit鐨勫?
ageLimit)); // 鍓嶉潰鐨勫璞?
濡傛灉鎴戜滑鐨勯渶姹傜◢寰敼鍙樹簡涓鐐癸紝鎴戜滑瑕佹帓闄ゆ墍鏈夎嚦灝戝拰ageLimit涓鏍瘋佺殑timestamp錛屼篃灝辨槸鎴戜滑闇瑕佹壘鍒扮涓涓瘮ageLimit騫磋交鐨則imestamp鐨勪綅緗傝繖鏄竴涓負upper_bound鐗瑰埗鐨勪換鍔★細
vt.erase(vt.begin(), upper_bound(vt.begin(), // 浠巚t涓櫎鍘繪墍鏈?
vt.end(), // 鎺掑湪ageLimit鐨勫煎墠闈?
ageLimit)); // 鎴栬呯瓑浠風殑瀵硅薄
濡傛灉浣犺鎶婁笢瑗挎彃鍏ヤ竴涓湁搴忓尯闂達紝鑰屼笖瀵硅薄鐨勬彃鍏ヤ綅緗槸鍦ㄦ湁搴忕殑絳変環鍏崇郴涓嬪畠搴旇鍦ㄧ殑鍦版柟鏃訛紝upper_bound涔熷緢鏈夌敤銆傛瘮濡傦紝浣犲彲鑳芥湁涓涓湁搴忕殑Person瀵硅薄鐨刲ist錛屽璞℃寜鐓ame鎺掑簭錛?/p>
class Person { public: ... const string& name() const; ... }; struct PersonNameLess: public binary_function<Person, Person, bool> { // 鍙傝鏉℃40 bool operator()(const Person& lhs, const Person& rhs) const { return lhs.name() < rhs.name(); } }; list<Person> lp; ... lp.sort(PersonNameLess()); // 浣跨敤PersonNameLess鎺掑簭lp
瑕佷繚鎸乴ist浠嶇劧鏄垜浠笇鏈涚殑欏哄簭錛堟寜鐓ame錛屾彃鍏ュ悗絳変環鐨勫悕瀛椾粛鐒舵寜欏哄簭鎺掑垪錛夛紝鎴戜滑鍙互鐢╱pper_bound鏉ユ寚瀹氭彃鍏ヤ綅緗細
Person newPerson;
...
lp.insert(upper_bound(lp.begin(), // 鍦╨p涓帓鍦╪ewPerson
lp.end(), // 涔嬪墠鎴栬呯瓑浠?
newPerson, // 鐨勬渶鍚庝竴涓?
PersonNameLess()), // 瀵硅薄鍚庨潰
newPerson); // 鎻掑叆newPerson
榪欏伐浣滅殑寰堝ソ鑰屼笖寰堟柟渚匡紝浣嗗緢閲嶈鐨勬槸涓嶈琚瀵尖斺旈敊璇湴璁や負upper_bound鐨勮繖縐嶇敤娉曡鎴戜滑欖旀湳鑸湴鍦ㄤ竴涓猯ist閲屽湪瀵規暟鏃墮棿鍐呮壘鍒頒簡鎻掑叆浣嶇疆銆傛垜浠茍娌℃湁鈥斺?a >鏉℃34瑙i噴浜嗗洜涓烘垜浠敤浜唋ist錛屾煡鎵捐姳璐圭嚎鎬ф椂闂達紝浣嗘槸瀹冨彧鐢ㄤ簡瀵規暟嬈$殑姣旇緝銆?/p>
涓鐩村埌榪欓噷錛屾垜閮藉彧鑰冭檻鎴戜滑鏈変竴瀵瑰畾涔変簡鎼滅儲鍖洪棿鐨勮凱浠e櫒鐨勬儏鍐點傞氬父鎴戜滑鏈変竴涓鍣紝鑰屼笉鏄竴涓尯闂淬傚湪榪欑鎯呭喌涓嬶紝鎴戜滑蹇呴』鍖哄埆搴忓垪鍜屽叧鑱斿鍣ㄣ傚浜庢爣鍑嗙殑搴忓垪瀹瑰櫒錛坴ector銆乻tring銆乨eque鍜宭ist錛夛紝浣犲簲璇ラ伒寰垜鍦ㄦ湰鏉℃鎻愬嚭鐨勫緩璁紝浣跨敤瀹瑰櫒鐨刡egin鍜宔nd榪唬鍣ㄦ潵鍒掑垎鍑哄尯闂淬?/p>
榪欑鎯呭喌瀵規爣鍑嗗叧鑱斿鍣紙set銆乵ultiset銆乵ap鍜宮ultimap錛夋潵璇存槸涓嶅悓鐨勶紝鍥犱負瀹冧滑鎻愪緵浜嗘悳绱㈢殑鎴愬憳鍑芥暟錛屽畠浠線寰鏄瘮鐢⊿TL綆楁硶鏇村ソ鐨勯夋嫨銆?a >鏉℃44璇︾粏璇存槑浜嗕負浠涔堝畠浠槸鏇村ソ鐨勯夋嫨錛岀畝瑕佸湴璇達紝鏄洜涓哄畠浠洿蹇涓烘洿鑷劧銆傚垢榪愮殑鏄紝鎴愬憳鍑芥暟閫氬父鍜岀浉搴旂殑綆楁硶鏈夊悓鏍風殑鍚嶅瓧錛屾墍浠ュ墠闈㈢殑璁ㄨ鎺ㄨ崘浣犱嬌鐢ㄧ殑綆楁硶count銆乫ind銆乪qual_range銆乴ower_bound鎴杣pper_bound錛屽湪鎼滅儲鍏寵仈瀹瑰櫒鏃朵綘閮藉彲浠ョ畝鍗曠殑鐢ㄥ悓鍚嶇殑鎴愬憳鍑芥暟鏉ヤ唬鏇褲?/p>
璋冪敤binary_search鐨勭瓥鐣ヤ笉鍚岋紝鍥犱負榪欎釜綆楁硶娌℃湁鎻愪緵瀵瑰簲鐨勬垚鍛樺嚱鏁般傝嫻嬭瘯鍦╯et鎴杕ap涓槸鍚﹀瓨鍦ㄦ煇涓鹼紝浣跨敤count鐨勬儻鐢ㄦ柟娉曟潵瀵規垚鍛樿繘琛屾嫻嬶細
set<Widget> s; // 寤虹珛set錛屾斁鍏ユ暟鎹?
...
Widget w; // w浠嶇劧鏄繚瀛樿鎼滅儲鐨勫?
...
if (s.count(w)) {
... // 瀛樺湪鍜寃絳変環鐨勫?
} else {
... // 涓嶅瓨鍦ㄨ繖鏍風殑鍊?
}
瑕佹祴璇曟煇涓煎湪multiset鎴杕ultimap涓槸鍚﹀瓨鍦紝find寰寰姣攃ount濂斤紝鍥犱負涓鏃︽壘鍒扮瓑浜庢湡鏈涘肩殑鍗曚釜瀵硅薄錛宖ind灝卞彲浠ュ仠涓嬩簡錛岃宑ount錛屽湪鏈閬殑鎯呭喌涓嬶紝蹇呴』媯嫻嬪鍣ㄩ噷鐨勬瘡涓涓璞°傦紙瀵逛簬set鍜宮ap錛岃繖涓嶆槸闂錛屽洜涓簊et涓嶅厑璁擱噸澶嶇殑鍊鹼紝鑰宮ap涓嶅厑璁擱噸澶嶇殑閿傦級
浣嗘槸錛宑ount緇欏叧鑱斿鍣ㄨ鏁版槸鍙潬鐨勩傜壒鍒紝瀹冩瘮璋冪敤equal_range鐒跺悗搴旂敤distance鍒扮粨鏋滆凱浠e櫒鏇村ソ銆傞鍏堬紝瀹冩洿娓呮櫚錛歝ount 鎰忓懗鐫“璁℃暟”銆傜浜岋紝瀹冩洿綆鍗曪紱涓嶇敤寤虹珛涓瀵硅凱浠e櫒鐒跺悗鎶婂畠鐨勭粍鎴?strong>錛堣瘧娉細灝辨槸first鍜宻econd錛?/strong>浼犵粰distance銆傜涓夛紝瀹冨彲鑳芥洿蹇竴鐐廣?/p>
瑕佺粰鍑烘墍鏈夋垜浠湪鏈潯嬈句腑鎵鑰冭檻鍒扮殑錛屾垜浠殑浠庡摢鍎跨潃鎵嬶紵涓嬮潰鐨勮〃鏍奸亾鍑轟簡涓鍒囥?/p>
浣犳兂鐭ラ亾鐨?/th> | 浣跨敤鐨勭畻娉?/th> | 浣跨敤鐨勬垚鍛樺嚱鏁?/th> | ||
---|---|---|---|---|
鍦ㄦ棤搴忓尯闂?/td> | 鍦ㄦ湁搴忓尯闂?/td> | 鍦╯et鎴杕ap涓?/td> | 鍦╩ultiset鎴杕ultimap涓?/td> | |
鏈熸湜鍊兼槸鍚﹀瓨鍦紵 | find | binary_search | count | find |
鏈熸湜鍊兼槸鍚﹀瓨鍦紵濡傛灉鏈夛紝絎竴涓瓑浜庤繖涓肩殑瀵硅薄鍦ㄥ摢閲岋紵 | find | equal_range | find | find鎴杔ower_bound錛堝弬瑙佷笅闈級 |
絎竴涓笉鍦ㄦ湡鏈涘間箣鍓嶇殑瀵硅薄鍦ㄥ摢閲岋紵 | find_if | lower_bound | lower_bound | lower_bound |
絎竴涓湪鏈熸湜鍊間箣鍚庣殑瀵硅薄鍦ㄥ摢閲岋紵 | find_if | upper_bound | upper_bound | upper_bound |
鏈夊灝戝璞$瓑浜庢湡鏈涘鹼紵 | count | equal_range錛岀劧鍚巇istance | count | count |
絳変簬鏈熸湜鍊肩殑鎵鏈夊璞″湪鍝噷錛?/td> | find錛堣凱浠o級 | equal_range | equal_range | equal_range |
涓婅〃鎬葷粨浜嗚鎬庝箞鎿嶄綔鏈夊簭鍖洪棿錛宔qual_range鐨勫嚭鐜伴鐜囧彲鑳戒護浜哄悆鎯娿傚綋鎼滅儲鏃訛紝榪欎釜棰戠巼鍥犱負絳変環媯嫻嬬殑閲嶈鎬ц屼笂鍗囦簡銆傚浜巐ower_bound鍜寀pper_bound錛屽畠寰堝鏄撳湪鐩哥瓑媯嫻嬩腑閫鍗達紝浣嗗浜巈qual_range錛屽彧媯嫻嬬瓑浠鋒槸寰堣嚜鐒剁殑銆傚湪絎簩琛屾湁搴忓尯闂達紝equal_range鎵撹觸浜唂ind榪樺洜涓轟竴涓悊鐢憋細equal_range鑺辮垂瀵規暟鏃墮棿錛岃宖ind鑺辮垂綰挎ф椂闂淬?/p>
瀵逛簬multiset鍜宮ultimap錛屽綋浣犲湪鎼滅儲絎竴涓瓑浜庣壒瀹氬肩殑瀵硅薄鐨勯偅涓琛岋紝榪欎釜琛ㄥ垪鍑轟簡find鍜宭ower_bound涓や釜綆楁硶浣滀負鍊欓夈?宸插浜庤繖涓換鍔ind鏄氬父鐨勯夋嫨錛岃屼笖浣犲彲鑳藉凡緇忔敞鎰忓埌鍦╯et鍜宮ap閭d竴鍒楅噷錛岃繖欏瑰彧鏈塮ind銆備絾鏄浜巑ulti瀹瑰櫒錛屽鏋滀笉鍙湁涓涓煎瓨鍦紝find騫朵笉淇濊瘉鑳借瘑鍒嚭瀹瑰櫒閲岀殑絳変簬緇欏畾鍊肩殑絎竴涓厓绱狅紱瀹冨彧璇嗗埆榪欎簺鍏冪礌涓殑涓涓傚鏋滀綘鐪熺殑闇瑕佹壘鍒扮瓑浜庣粰瀹氬肩殑絎竴涓厓绱狅紝浣犲簲璇ヤ嬌鐢╨ower_bound錛岃屼笖浣犲繀欏繪墜鍔ㄧ殑瀵圭浜岄儴鍒嗗仛絳変環媯嫻嬶紝鏉℃19鐨勫唴瀹瑰彲浠ュ府浣犵‘璁や綘宸茬粡鎵懼埌浜嗕綘瑕佹壘鐨勫箋傦紙浣犲彲浠ョ敤equal_range鏉ラ伩鍏嶄綔鎵嬪姩絳変環媯嫻嬶紝浣嗘槸璋冪敤equal_range鐨勮姳璐規瘮璋冪敤lower_bound澶氬緱澶氥傦級
鍦╟ount銆乫ind銆乥inary_search銆乴ower_bound銆乽pper_bound鍜宔qual_range涓仛鍑洪夋嫨寰堢畝鍗曘傚綋浣犺皟鐢ㄦ椂錛岄夋嫨綆楁硶榪樻槸鎴愬憳鍑芥暟鍙互緇欎綘闇瑕佺殑琛屼負鍜屾ц兘錛岃屼笖鏄渶灝戠殑宸ヤ綔銆傛寜鐓ц繖涓緩璁仛錛堟垨鍙傝冮偅涓〃鏍鹼級錛屼綘灝變笉浼氬啀鏈夊洶鎯戙?/p>