锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
find鍛戒護(hù)鏄竴涓棤澶勪笉鍦ㄥ懡浠わ紝鏄痩inux涓渶鏈夌敤鐨勫懡浠や箣涓銆俧ind鍛戒護(hù)鐢ㄤ簬錛氬湪涓涓洰褰曪紙鍙?qiáng)瀛愮洰褰曞Q変腑鎼滅儲(chǔ)鏂囦歡錛屼綘鍙互鎸囧畾涓浜涘尮閰嶆潯浠訛紝濡傛寜鏂囦歡鍚嶃佹枃浠剁被鍨嬨佺敤鎴風(fēng)敋鑷蟲(chóng)槸鏃墮棿鎴蟲(chóng)煡鎵炬枃浠躲備笅闈㈠氨閫氳繃瀹炰緥鏉ヤ綋楠屼笅find鍛戒護(hù)鐨勫己澶с?/p>
man鏂囨。涓粰鍑虹殑find鍛戒護(hù)鐨勪竴鑸艦寮忎負(fù)錛?/p>
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
鍏跺疄[-H] [-L] [-P] [-D debugopts] [-Olevel]榪欏嚑涓夐」騫朵笉甯哥敤錛堣嚦灝戝湪鎴戠殑鏃ュ父宸ヤ綔涓紝娌℃湁鐢ㄥ埌榪囷級(jí)錛屼笂闈㈢殑find鍛戒護(hù)鐨勫父鐢ㄥ艦寮忓彲浠ョ畝鍖栦負(fù)錛?/p>
find [path...] [expression]
涔熸湁浜鴻繖鏍鋒葷粨find鍛戒護(hù)鐨勭粨鏋勶細(xì)
find start_directory test
options
criteria_to_match
action_to_perform_on_results
鍦ㄤ嬌鐢╢ind鍛戒護(hù)鐨?exec閫夐」澶勭悊鍖歸厤鍒扮殑鏂囦歡鏃訛紝 find鍛戒護(hù)灝嗘墍鏈夊尮閰嶅埌鐨勬枃浠朵竴璧蜂紶閫掔粰exec鎵ц銆備絾鏈変簺緋葷粺瀵硅兘澶熶紶閫掔粰exec鐨勫懡浠ら暱搴︽湁闄愬埗錛岃繖鏍峰湪find鍛戒護(hù)榪愯鍑犲垎閽熶箣鍚庯紝灝變細(xì)鍑虹幇婧㈠嚭閿欒銆傞敊璇俊鎭氬父鏄滃弬鏁板垪澶暱鈥濇垨鈥滃弬鏁板垪婧㈠嚭鈥濄傝繖灝辨槸xargs鍛戒護(hù)鐨勭敤澶勬墍鍦紝鐗瑰埆鏄笌find鍛戒護(hù)涓璧蜂嬌鐢ㄣ?/p>
find鍛戒護(hù)鎶婂尮閰嶅埌鐨勬枃浠朵紶閫掔粰xargs鍛戒護(hù)錛岃寈args鍛戒護(hù)姣忔鍙幏鍙栦竴閮ㄥ垎鏂囦歡鑰屼笉鏄叏閮紝涓嶅儚-exec閫夐」閭f牱銆傝繖鏍峰畠鍙互鍏堝鐞嗘渶鍏堣幏鍙栫殑涓閮ㄥ垎鏂囦歡錛岀劧鍚庢槸涓嬩竴鎵癸紝騫跺姝ょ戶緇笅鍘匯?/p>
鍦ㄦ湁浜涚郴緇熶腑錛屼嬌鐢?exec閫夐」浼?xì)湄?fù)澶勭悊姣忎竴涓尮閰嶅埌鐨勬枃浠惰屽彂璧蜂竴涓浉搴旂殑榪涚▼錛屽茍闈炲皢鍖歸厤鍒扮殑鏂囦歡鍏ㄩ儴浣滀負(fù)鍙傛暟涓嬈℃墽琛岋紱榪欐牱鍦ㄦ湁浜涙儏鍐典笅灝變細(xì)鍑虹幇榪涚▼榪囧錛岀郴緇熸ц兘涓嬮檷鐨勯棶棰橈紝鍥犺屾晥鐜囦笉楂橈紱
鑰屼嬌鐢▁args鍛戒護(hù)鍒欏彧鏈変竴涓繘紼嬨傚彟澶栵紝鍦ㄤ嬌鐢▁args鍛戒護(hù)鏃訛紝絀剁珶鏄竴嬈¤幏鍙栨墍鏈夌殑鍙傛暟錛岃繕鏄垎鎵瑰彇寰楀弬鏁幫紝浠ュ強(qiáng)姣忎竴嬈¤幏鍙栧弬鏁扮殑鏁扮洰閮戒細(xì)鏍規(guī)嵁璇ュ懡浠ょ殑閫夐」鍙?qiáng)绯痪l熷唴鏍鎬腑鐩稿簲鐨勫彲璋冨弬鏁版潵紜畾銆?/font>
鏉ョ湅鐪媥args鍛戒護(hù)鏄浣曞悓find鍛戒護(hù)涓璧蜂嬌鐢ㄧ殑錛屽茍緇欏嚭涓浜涗緥瀛愩?/p>
find . -type f -print | xargs file 鏌ユ壘緋葷粺涓殑姣忎竴涓櫘閫氭枃浠訛紝鐒跺悗浣跨敤xargs鍛戒護(hù)鏉ユ祴璇曞畠浠垎鍒睘浜庡摢綾繪枃浠?/p>
find / -name "core" -print | xargs echo "" >/tmp/core.log 鍦ㄦ暣涓郴緇熶腑鏌ユ壘鍐呭瓨?shù)俊鎭浆鍌ㄦ枃錃g(core dump) 錛岀劧鍚庢妸緇撴灉淇濆瓨鍒?tmp/core.log 鏂囦歡涓細(xì)
find . -type f -print | xargs grep "hostname" 鐢╣rep鍛戒護(hù)鍦ㄦ墍鏈夌殑鏅氭枃浠朵腑鎼滅儲(chǔ)hostname榪欎釜璇?/p>
find ./ -mtime +3 -print|xargs rm -f 鈥搑 鍒犻櫎3澶╀互鍓嶇殑鎵鏈変笢瑗?錛坒ind . -ctime +3 -exec rm -rf {} \;錛?/p>
find ./ -size 0 | xargs rm -f & 鍒犻櫎鏂囦歡澶у皬涓洪浂鐨勬枃浠?/p>
find鍛戒護(hù)閰嶅悎浣跨敤exec鍜寈args鍙互浣跨敤鎴峰鎵鍖歸厤鍒扮殑鏂囦歡鎵ц鍑犱箮鎵鏈夌殑鍛戒護(hù)銆?/p>
grep (global search regular expression(RE) and print out the line,鍏ㄩ潰鎼滅儲(chǔ)姝e垯琛ㄨ揪寮忓茍鎶婅鎵撳嵃鍑烘潵)鏄竴縐嶅己澶х殑鏂囨湰鎼滅儲(chǔ)宸ュ叿錛屽畠鑳戒嬌鐢ㄦ鍒欒〃杈懼紡鎼滅儲(chǔ)鏂囨湰錛屽茍鎶婂尮閰嶇殑琛屾墦鍗板嚭鏉ャ?/p>
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
grep鍛戒護(hù)鐢ㄤ簬鎼滅儲(chǔ)鐢盤(pán)attern鍙傛暟鎸囧畾鐨勬ā寮忥紝騫跺皢姣忎釜鍖歸厤鐨勮鍐欏叆鏍囧噯杈撳嚭涓傝繖浜涙ā寮忔槸鍏鋒湁闄愬畾鐨勬鍒欒〃杈懼紡錛屽畠浠嬌鐢╡d鎴杄grep鍛戒護(hù)鏍峰紡銆傚鏋滃湪File鍙傛暟涓寚瀹氫簡(jiǎn)澶氫釜鍚嶇О錛実rep鍛戒護(hù)灝嗘樉紺哄寘鍚尮閰嶈鐨勬枃浠剁殑鍚嶇О銆傚 shell 鏈夌壒孌婂惈涔夌殑瀛楃 ($, *, [, |, ^, (, ), \ ) 鍑虹幇鍦?Pattern鍙傛暟涓椂蹇呴』甯﹀弻寮曞彿銆傚鏋?Pattern鍙傛暟涓嶆槸綆鍗曞瓧絎︿覆錛岄氬父蹇呴』鐢ㄥ崟寮曞彿灝嗘暣涓ā寮忔嫭璧鋒潵銆傚湪璇稿 [a-z], 涔嬬被鐨勮〃杈懼紡涓紝-錛堝噺鍙鳳級(jí)cml 鍙牴鎹綋鍓嶆鍦ㄦ暣鐞嗙殑搴忓垪鏉ユ寚瀹氫竴涓寖鍥淬傛暣鐞嗗簭鍒楀彲浠ュ畾涔夌瓑浠風(fēng)殑綾諱互渚涘湪瀛楃鑼冨洿涓嬌鐢ㄣ傚鏋滄湭鎸囧畾浠諱綍鏂囦歡錛実rep浼?xì)鍋囧畾湄?fù)鏍囧噯杈撳叆銆?/p>
^ 閿氬畾琛岀殑寮濮?濡傦細(xì)'^grep'鍖歸厤鎵鏈変互grep寮澶寸殑琛屻?/p>
$ 閿氬畾琛岀殑緇撴潫 濡傦細(xì)'grep$'鍖歸厤鎵鏈変互grep緇撳熬鐨勮銆?/p>
. 鍖歸厤涓涓潪鎹㈣絎︾殑瀛楃 濡傦細(xì)'gr.p'鍖歸厤gr鍚庢帴涓涓換鎰忓瓧絎︼紝鐒跺悗鏄痯銆?/p>
* 鍖歸厤闆朵釜鎴栧涓厛鍓嶅瓧絎?濡傦細(xì)'*grep'鍖歸厤鎵鏈変竴涓垨澶氫釜絀烘牸鍚庣揣璺焔rep鐨勮銆?font size="3"> .*涓璧風(fēng)敤浠h〃浠繪剰瀛楃銆?/p>
[] 鍖歸厤涓涓寚瀹氳寖鍥村唴鐨勫瓧絎︼紝濡?[Gg]rep'鍖歸厤Grep鍜実rep銆?/p>
[^] 鍖歸厤涓涓笉鍦ㄦ寚瀹氳寖鍥村唴鐨勫瓧絎︼紝濡傦細(xì)'[^A-FH-Z]rep'鍖歸厤涓嶅寘鍚獳-R鍜孴-Z鐨勪竴涓瓧姣嶅紑澶達(dá)紝绱ц窡rep鐨勮銆?/p>
\(..\) 鏍囪鍖歸厤瀛楃錛屽錛?\(love\)'錛宭ove琚爣璁頒負(fù)1銆?/p>
\< 閿氬畾鍗曡瘝鐨勫紑濮嬶紝濡傦細(xì)'\<grep'鍖歸厤鍖呭惈浠rep寮澶寸殑鍗曡瘝鐨勮銆?/p>
\> 閿氬畾鍗曡瘝鐨勭粨鏉燂紝濡?grep\>'鍖歸厤鍖呭惈浠rep緇撳熬鐨勫崟璇嶇殑琛屻?/p>
x\{m\} 榪炵畫(huà)閲嶅瀛楃x錛宮嬈★紝濡傦細(xì)'o\{5\}'鍖歸厤鍖呭惈榪炵畫(huà)5涓猳鐨勮銆?/p>
x\{m,\} 榪炵畫(huà)閲嶅瀛楃x,鑷沖皯m嬈★紝濡傦細(xì)'o\{5,\}'鍖歸厤鑷沖皯榪炵畫(huà)鏈?涓猳鐨勮銆?/p>
x\{m,n\} 榪炵畫(huà)閲嶅瀛楃x錛岃嚦灝憁嬈★紝涓嶅浜巒嬈★紝濡傦細(xì)'o\{5,10\}'鍖歸厤榪炵畫(huà)5--10涓猳鐨勮銆?/p>
\w 鍖歸厤涓涓枃瀛楀拰鏁板瓧瀛楃錛屼篃灝辨槸[A-Za-z0-9]錛屽錛?G\w*p'鍖歸厤浠鍚庤窡闆朵釜鎴栧涓枃瀛楁垨鏁板瓧瀛楃錛岀劧鍚庢槸p銆?/p>
\W w鐨勫弽緗艦寮忥紝鍖歸厤涓涓潪鍗曡瘝瀛楃錛屽鐐瑰彿鍙ュ彿絳夈俓W*鍒欏彲鍖歸厤澶氫釜銆?/p>
\b 鍗曡瘝閿佸畾絎︼紝濡? '\bgrep\b'鍙尮閰峠rep錛屽嵆鍙兘鏄痝rep榪欎釜鍗曡瘝錛屼袱杈瑰潎涓虹┖鏍箋?/p>
-?
鍚屾椂鏄劇ず鍖歸厤琛屼笂涓嬬殑錛熻錛屽錛歡rep -2 pattern filename鍚屾椂鏄劇ず鍖歸厤琛岀殑涓婁笅2琛屻?/p>
-b錛?-byte-offset
鎵撳嵃鍖歸厤琛屽墠闈㈡墦鍗拌琛屾墍鍦ㄧ殑鍧楀彿鐮併?/p>
-c,--count
鍙墦鍗板尮閰嶇殑琛屾暟錛屼笉鏄劇ず鍖歸厤鐨勫唴瀹廣?/p>
-f File錛?-file=File
浠庢枃浠朵腑鎻愬彇妯℃澘銆傜┖鏂囦歡涓寘鍚?涓ā鏉匡紝鎵浠ヤ粈涔堥兘涓嶅尮閰嶃?/p>
-h錛?-no-filename
褰撴悳绱㈠涓枃浠舵椂錛屼笉鏄劇ず鍖歸厤鏂囦歡鍚嶅墠緙銆?/p>
-i錛?-ignore-case
蹇界暐澶у皬鍐欏樊鍒?/p>
-q錛?-quiet
鍙栨秷鏄劇ず錛屽彧榪斿洖閫鍑虹姸鎬併?鍒欒〃紺烘壘鍒頒簡(jiǎn)鍖歸厤鐨勮銆?/p>
-l錛?-files-with-matches
鎵撳嵃鍖歸厤妯℃澘鐨勬枃浠舵竻鍗曘?/p>
-L錛?-files-without-match
鎵撳嵃涓嶅尮閰嶆ā鏉跨殑鏂囦歡娓呭崟銆?/p>
-n錛?-line-number
鍦ㄥ尮閰嶇殑琛屽墠闈㈡墦鍗拌鍙楓?/p>
-s錛?-silent
涓嶆樉紺哄叧浜庝笉瀛樺湪鎴栬呮棤娉曡鍙栨枃浠剁殑閿欒淇℃伅銆?/p>
-v錛?-revert-match
鍙嶆绱紝鍙樉紺轟笉鍖歸厤鐨勮銆?/p>
-w錛?-word-regexp
濡傛灉琚玕<鍜孿>寮曠敤錛屽氨鎶婅〃杈懼紡鍋氫負(fù)涓涓崟璇嶆悳绱€?/p>
-V錛?-version
鏄劇ず杞歡鐗堟湰淇℃伅銆?/p>
=====
ls -l | grep '^a' 閫氳繃綆¢亾榪囨護(hù)ls -l杈撳嚭鐨勫唴瀹癸紝鍙樉紺轟互a寮澶寸殑琛屻?/p>
grep 'test' d* 鏄劇ず鎵鏈変互d寮澶寸殑鏂囦歡涓寘鍚玹est鐨勮銆?/p>
grep 'test' aa bb cc 鏄劇ず鍦╝a錛宐b錛宑c鏂囦歡涓尮閰峵est鐨勮銆?/p>
grep '[a-z]' aa 鏄劇ず鎵鏈夊寘鍚瘡涓瓧絎︿覆鑷沖皯鏈?涓繛緇皬鍐欏瓧絎︾殑瀛楃涓茬殑琛屻?/p>
grep 'w(es)t.*' aa 濡傛灉west琚尮閰嶏紝鍒檈s灝辮瀛樺偍鍒板唴瀛樹(shù)腑錛屽茍鏍囪涓?錛岀劧鍚庢悳绱換鎰忎釜瀛楃(.*)錛岃繖浜涘瓧絎﹀悗闈㈢揣璺熺潃鍙﹀涓涓猠s()錛屾壘鍒板氨鏄劇ず璇ヨ銆傚鏋滅敤egrep鎴杇rep -E錛屽氨涓嶇敤""鍙瘋繘琛岃漿涔夛紝鐩存帴鍐欐垚'w(es)t.*'灝卞彲浠ヤ簡(jiǎn)銆?/p>
grep -i pattern files 錛氫笉鍖哄垎澶у皬鍐欏湴鎼滅儲(chǔ)銆傞粯璁ゆ儏鍐靛尯鍒嗗ぇ灝忓啓
grep -l pattern files 錛氬彧鍒楀嚭鍖歸厤鐨勬枃浠跺悕錛?/p>
grep -L pattern files 錛氬垪鍑轟笉鍖歸厤鐨勬枃浠跺悕錛?/p>
grep -w pattern files 錛氬彧鍖歸厤鏁翠釜鍗曡瘝錛岃屼笉鏄瓧絎︿覆鐨勪竴閮ㄥ垎(濡傚尮閰嶁榤agic鈥欙紝鑰屼笉鏄榤agical鈥?錛?/p>
grep -C number pattern files 錛氬尮閰嶇殑涓婁笅鏂囧垎鍒樉紺篬number]琛岋紝
grep pattern1 | pattern2 files 錛氭樉紺哄尮閰?pattern1 鎴?pattern2 鐨勮錛?/p>
grep pattern1 files | grep pattern2 錛氭樉紺烘棦鍖歸厤 pattern1 鍙堝尮閰?pattern2 鐨勮銆?/p>
鍙傝冩枃鐚細(xì)
鈥斺斿熸鎰熻阿鍦ㄥ疄涔?fàn)鍏徃鍚屼簨浠l欎笌鐨勫府鍔╋紝
鐗瑰埆鏄疛ay銆丣eff銆?/p>
Map鏄爣鍑?strong>鍏寵仈寮忓鍣?/strong>錛?em>associative container錛変箣涓錛屼竴涓猰ap鏄竴涓敭鍊煎搴忓垪錛屽嵆錛坘ey ,value錛夊銆傚畠鎻愪緵鍩轟簬key鐨?strong>蹇?/strong>媯(gè)绱㈣兘鍔涳紝鍦ㄤ竴涓猰ap涓璳ey鍊兼槸鍞竴鐨勩俶ap鎻愪緵鍙屽悜榪唬鍣紝鍗蟲(chóng)湁浠庡墠寰鍚庣殑錛坕terator錛夛紝涔熸湁浠庡悗寰鍓嶇殑錛坮everse_iterator錛夈?/p>
map瑕佹眰鑳藉key榪涜<鎿嶄綔錛屼笖淇濇寔鎸塳ey鍊奸掑鏈夊簭錛屽洜姝ap涓婄殑榪唬鍣ㄤ篃鏄掑鏈夊簭鐨勩傚鏋滃浜庡厓绱犲茍涓嶉渶瑕佷繚鎸佹湁搴忥紝鍙互浣跨敤hash_map銆?/p>
map涓璳ey鍊兼槸鍞竴鐨勶紝濡傛灉椹尮涓凡瀛樺湪涓涓敭鍊煎(鏄電О,瀵嗙爜):("skynet",407574364)錛岃屾垜浠繕鎯蟲(chóng)彃鍏ヤ竴涓敭鍊煎("skynet",472687789)鍒欎細(xì)鎶ラ敊錛?span style="color: #ff0000;">涓嶆槸鎶ラ敊錛屽噯紜殑璇存槸錛岃繑鍥炴彃鍏ヤ笉鎴愬姛錛?/span>錛夈傝屾垜浠張鐨勭‘鎯寵繖鏍峰仛錛屽嵆涓涓敭瀵瑰簲澶氫釜鍊鹼紝騫歌繍鐨勬槸multimap鍙槸瀹炵幇榪欎釜鍔熻兘銆?/p>
涓嬮潰鎴戜滑鐢ㄥ疄渚嬫潵娣卞叆浠嬬粛map銆?em>multimap錛屼富瑕佸唴瀹瑰涓嬶細(xì)
鏈変竴涓湇鍔″櫒manager緇存姢鐫鎺ュ叆鏈嶅姟鍣ㄧ殑client淇℃伅錛屽寘鎷琧linetId銆乻canRate銆乻ocketAddr絳夌瓑銆傛垜浠畾涔変竴涓粨鏋勪綋淇濆瓨scanRate銆乻ocketAddr淇℃伅銆傚涓嬶細(xì)
typedef int clientId;
typedef struct{
int scanRate;
string socketAddr;
}clientInfo;
鎴戜滑鐢╩ap淇濆瓨榪欎簺淇℃伅錛歝lientId涓洪敭key錛宑lientInfo涓哄箋傝繖鏍鋒垜浠彲浠ラ氳繃clientId蹇熸绱㈠埌client鐨勭浉鍏充俊鎭紝鎴戜滑鍙互榪欐牱瀹氫箟錛?/p>
map<clientId,clientInfo> clientMap;
榪欐牱鎴戜滑瀹氫箟浜?jiǎn)涓涓猚lientMap錛屽鏋滄垜浠瀹氫箟澶氫釜榪欐牱鐨刴ap錛岄渶瑕佸嬈″啓map<clientId,clientInfo> 鍙橀噺鍚嶃備負(fù)浜?jiǎn)閬垮厤杩欐犱h儏鍐碉紝鎴戜滑閫氬父涓簃ap<clientId,clientInfo>瀹氫箟涓埆鍚嶏紝濡傦細(xì)
typedef map<clientId,clientInfo> clientEdp; clientEdp clientMap;
涔嬪悗鎴戜滑灝卞彲浠ュ儚瀹氫箟clientMap涓鏍峰畾涔塵ap<clientId,clientInfo>瀵硅薄錛岃繖鏍風(fēng)殑濂藉榪樻湁錛氬鏋滄垜浠渶瑕佷慨鏀筸ap鐨勫畾涔夛紝鍙渶瑕佸湪涓澶勪慨鏀瑰嵆鍙紝閬垮厤淇敼涓嶅交搴曢犳垚鐨勪笉涓鑷寸幇璞°?/p>
鎴戜滑榪欏氨瀹屾垚浜?jiǎn)闇瑕佺殑map鐨勫畾涔夛紝濡傛灉涓嶅畾涔夋垨娌℃湁鍦ㄥ畠涓婇潰鐨勬搷浣滅殑璇濓紝灝卞儚瀹氫箟綾昏屾病鏈夋柟娉曚竴鏍鳳紝鎰忎箟涓嶅ぇ鎴栨鏃犳剰涔夈傚垢榪愮殑鏄紝STL鎻愪緵浜?jiǎn)杩欎簺甯哥敤鎿嶄綔锛?xì)鎺掑簭錛堟敞錛歮ap鏄笉鑳戒篃涓嶈鎺掑簭鐨勶紝鍥犱負(fù)map鏈韓宸茬粡鎺掑ソ搴忎簡(jiǎn)錛夈佹墦鍗般佹彁鍙栧瓙閮ㄥ垎銆佺Щ闄ゅ厓绱犮佹坊鍔犲厓绱犮佹煡鎵懼璞★紝灝卞儚鏁版嵁搴撶殑澧炲垹鏀規(guī)煡鎿嶄綔錛佺幇鍦ㄦ垜浠緇嗕粙緇嶈繖浜涙搷浣滐紝騫墮愭寮曞叆hash_map銆?em>multimap銆?/p>
鍏寵仈鏁扮粍錛?em>associative array錛夋槸鏈鏈夌敤鐨勭敤鎴峰畾涔夌被鍨嬩箣涓錛岀粡甯稿唴緗湪璇█涓敤浜庢枃鏈鐞嗙瓑銆備竴涓叧鑱旀暟緇勯氬父涔熺О涓簃ap錛屾湁鏃朵篃縐板瓧鍏革紙dictionary錛夛紝淇濆瓨?shù)竴瀵瑰箋傜涓涓肩О涓簁ey銆佺浜屼釜縐頒負(fù)鏄犲皠鍊糾apped-value銆?/p>
鏍囧噯map鏄畾涔夊湪std鍛藉悕絀洪棿涓殑涓涓ā鏉匡紝騫惰〃紺轟負(fù)<map>銆傚畠棣栧厛瀹氫箟浜?jiǎn)涓緇勬爣鍑嗙被鍨嬪悕瀛楋細(xì)
template<class Key,class T,class Cmp=less<key>,
class A=allocator<pair<const Key,T>>
class std::map
{
public:
//types
typedef Key key_type;
typedef T mapped_type;
typedef pair<const Key,T> value_type;
typedef Cmp key_compare;
typedef A allocator_type;
typedef typename A::reference reference;
typedef typename A::const_reference const_reference;
typedef implementation_define1 iterator;
typedef implementation_define2 const_iterator;
typedef typename A::size_type size_type;
typedef typename A::difference_type difference_type;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
//...
}
娉ㄦ剰錛歮ap鐨剉alue_type鏄竴涓?key,value)瀵癸紝鏄犲皠鍊肩殑琚涓烘槸mapped_type銆傚洜姝わ紝涓涓猰ap鏄竴涓猵air<const Key,mapped_type>鍏冪礌鐨勫簭鍒椼備粠const Key鍙互鐪嬪嚭錛宮ap涓敭key鏄笉鍙慨鏀圭殑銆?/p>
涓嶅緱涓嶆彁鐨勬槸map瀹氫箟涓瑿mp鍜孉閮芥槸鍙夐」銆侰mp鏄畾涔夊湪鍏冪礌涔嬮棿鐨勬瘮杈冩柟娉曪紝榛樿鏄?lt;鎿嶄綔錛汚鍗砤llocator鐢ㄦ潵鍒嗛厤鍜?strong>閲婃斁map鎬婚敭鍊煎鎵闇浣跨敤鐨勫唴瀛橈紝娌℃湁鎸囧畾鐨勮瘽鍗抽粯璁や嬌鐢ㄧ殑鏄疭TL鎻愪緵鐨勶紝涔熷彲浠ヨ嚜瀹氫箟allocator鏉ョ鐞嗗唴瀛樼殑浣跨敤銆傚鏁版儏鍐碉紝鎴戜滑涓嶆寚瀹氳繖涓や釜閫夐」鑰屼嬌鐢ㄩ粯璁ゅ鹼紝榪欐牱鎴戜滑瀹氫箟map灝卞儚涓嬮潰榪欐牱錛?/p>
map<int,clientInfo> clientMap;
Cmp鍜孉閮界己鐪併?閫氬父錛屽疄闄呯殑榪唬鍣ㄦ槸瀹炵幇瀹氫箟鐨勶紝鍥犱負(fù)map寰堝儚浣跨敤浜?jiǎn)鏍?wèi)鐨勫艦寮忥紝榪欎簺榪唬鍣ㄩ氬父鎻愪緵鏍?wèi)閬嶅巻鐨勬煇绉嶅舰寮忋傞嗗悜榪唬鍣ㄦ槸浣跨敤鏍囧噯鐨剅everse_iterator妯℃澘鏋勯犵殑銆?/p>
map鎻愪緵鎯父鐨勮繑鍥炶凱浠e櫒鐨勪竴緇勫嚱鏁幫紝濡備笅鎵紺猴細(xì)
template<class Key,class T,class Cmp=less<key>,
class A=allocator<pair<const Key,T>>
class std::map
{
public:
//...
//iterators
iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
reverse_iterator rend();
const_reverse_iterator rend() const;
//...
}
map涓婄殑榪唬鍣ㄦ槸pair<const Key,mapped_type>鍏冪礌搴忓垪涓婄畝鍗曠殑榪唬銆備緥濡傦紝鎴戜滑鍙兘闇瑕佹墦鍗板嚭鎵鏈夌殑瀹㈡埛绔俊鎭紝鍍忎笅闈㈢殑紼嬪簭榪欐牱銆備負(fù)浜?jiǎn)瀹炵幇杩欎釜锛屾垜浠鍏堝悜銆婁緥瀛愬紩鍏ャ嬩腑瀹氫箟鐨刢lientEdp涓彃鍏ユ暟鎹紝鐒跺悗鎵撳嵃鍑烘潵錛?/p>
#include<iostream>
#include<map>
#include<string>
using namespace std;
typedef int clientId;
typedef struct{
int scanRate;
string socketAddr;
}clientInfo;
int main(int argc,char** argv)
{
typedef map<clientId,clientInfo> clientEdp;
typedef map<clientId,clientInfo>::const_iterator iterator;
clientEdp clients;
clientInfo client[100];
char str[10];
string strAddr("socket addr client ");
for(int i=0;i<100;i++)
{
client[i].scanRate=i+1;
//convert int to char*
itoa(i+1,str,10);
//concatenate strAddr and str
client[i].socketAddr=strAddr+str;
cout<<client[i].socketAddr<<endl;
clients.insert(
make_pair(i+1,client[i]));
}
delete str;
for(iterator i=clients.begin();i!=clients.end();i++)
{
cout<<"clientId:"<<i->first<<endl;
cout<<"scanRate:"<<i->second.scanRate<<endl;
cout<<"socketAddr:"<<i->second.socketAddr<<endl;
cout<<endl;
}
}
涓涓猰ap榪唬鍣ㄤ互key鍗囧簭鏂瑰紡琛ㄧず鍏冪礌錛屽洜姝ゅ鎴風(fēng)淇℃伅浠liendId鍗囧簭鐨勬柟寮忚緭鍑恒傝繍琛岀粨鏋滃彲浠ヨ瘉鏄庤繖涓鐐癸紝榪愯緇撴灉濡備笅鎵紺猴細(xì)
鍥?銆佺▼搴忚繍琛岀粨鏋?/p>
鎴戜滑浠irst寮曠敤閿煎鐨刱ey錛屼互second寮曠敤mapped value錛屼笖涓嶇敤綆ey鍜宮apped value鏄粈涔堢被鍨嬨傚叾瀹瀙air鍦╯td鐨勬ā鏉夸腑鏄繖鏍峰畾涔夌殑錛?/p>
template <class T1,class T2>struct std::pair{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair():first(T1()),second(T2()){}
pair(const T1& x,const T2& y):first(x),second(y){}
template<class U,class V>
pair(const pair<U,V>& p):first(p.first),second(p.second){}
}
鍗砿ap涓紝key鏄敭鍊煎鐨勭涓涓厓绱犱笖mapped value鏄浜屼釜鍏冪礌銆俻air鐨勫畾涔夊彲浠ュ湪<utility>涓壘鍒幫紝pair鎻愪緵浜?jiǎn)涓涓柟娉曟柟渚垮垱寤洪敭鍊煎錛?/p>
template <class T1,class T2>pair<T1,T2>
std::make_pair(const T1& t1,const T2& t2)
{
return pair<T1,T2>(t1,t2);
}
涓婇潰鐨勪緥瀛愪腑鎴戜滑灝辯敤鍒頒簡(jiǎn)榪欎釜鏂規(guī)硶鏉ュ垱寤?clientId,clientInfo)瀵癸紝騫朵綔涓篒nsert()鏂規(guī)硶鐨勫弬鏁般傛瘡涓猵air榛樿鍒濆鍖栨瘡涓厓绱犵殑鍊間負(fù)瀵瑰簲綾誨瀷鐨勯粯璁ゅ箋?/p>
map綾繪儻甯告彁渚涗簡(jiǎn)鏋勯犲嚱鏁板拰鏋愭瀯鍑芥暟錛屽涓嬫墍紺猴細(xì)
template<class Key,class T,class Cmp=less<key>,
class A=allocator<pair<const Key,T>>
class std::map
{
//...
//construct/copy/destroy
explicit map(const Cmp&=Cmp(),const A&=A());
template<class In>map(In first,In last,
const Com&=Cmp(),const A&=A());
map(const map&);
~map();
map& operator=(const map&);
//...
}
澶嶅埗涓涓鍣ㄦ剰鍛崇潃涓哄畠鐨勬瘡涓厓绱犲垎閰嶇┖闂達(dá)紝騫舵嫹璐濇瘡涓厓绱犲箋傝繖鏍峰仛鏄ц兘寮閿鏄緢澶х殑錛屽簲璇ヤ粎褰撻渶瑕佺殑鏃跺欐墠榪欐牱鍋氥?strong>鍥犳錛宮ap浼犵殑鏄紩鐢?/strong>銆?/p>
鍓嶉潰鎴戜滑宸茬粡璇磋繃錛屽鏋渕ap涓粎瀹氫箟浜?jiǎn)涓浜沰ey銆乵apped value綾誨瀷鐨勪俊鎭屾病鏈夋搷浣滄柟娉曪紝灝卞瀹氫箟涓粎鏈夊瓧孌電殑綾繪剰涔変笉澶х敋鑷蟲(chóng)鏃犳剰涔夈傜敱姝ゅ彲瑙乵ap涓畾涔夋搷浣滄柟娉曢潪甯擱噸瑕侊紒鍓嶉潰鐨勪緥瀛愭垜浠氨鐢ㄥ埌浜?jiǎn)涓崬畱鏂规硶锛屽杩斿洖鑴P浠e櫒鐨勬柟娉昩egin()銆乪nd()錛岄敭鍊煎鎻掑叆鏂規(guī)硶insert()銆備笅闈㈡垜浠map涓殑鎿嶄綔鏂規(guī)硶鍋氫釜鍏ㄩ潰鐨勪粙緇嶏細(xì)
template<class Key,class T,class Cmp=less<key>,
class A=allocator<pair<const Key,T>>
class std::map
{
//...
//map operations
//find element with key k
iterator find(const key_type& k);
const_iterator find(const key_type& k) const;
//find number of elements with key k
size_type count() const;
//find first element with key k
iterator lower_bound(const key_type& k);
const_iterator lower_bound(const key_type& k) const;
//find first element with key greater than k
iterator upper_bound(const key_type& k);
const_iterator upper_bound(const key_type& k) const;
//insert pair(key,value)
pair<iterator,bool>insert(const value_type& val);
iterator insert(iterator pos,const value_type& val);
template<class In>void insert(In first,In last);
//erase element
void erase(iterator pos);
size_type erase(const key_type& k);
void erase(iterator first,iterator last);
void clear();
//number os elements
size_type size() const;
//size of largest possible map
size_type max_size() const;
bool empty() const{return size()==0;}
void swap(map&);
//...
}
涓婇潰榪欎簺鏂規(guī)硶鍩烘湰閮借兘欏懼悕鎬濅箟錛圥S.鐢辨鍙錛屽懡鍚嶆湁澶氶噸瑕侊紝鎴戜滑騫蟲(chóng)椂瑕佸吇鎴愬ソ鐨勫懡鍚嶄範(fàn)鎯紝褰撶劧娉ㄩ噴涔熷繀涓嶅彲灝戯紒錛夈傝櫧鐒跺凡緇忛潪甯告竻妤氫簡(jiǎn)浜?jiǎn)锛屼絾鎴憳q樻槸鎯寵瑙d竴涓嬩互娑堥櫎涓嶆儨瑕佺殑璇В鍜屾洿濂藉湴搴旂敤榪欎簺鏂規(guī)硶銆?/p>
#include<iostream>
#include<map>
#include<string>
using namespace std;
typedef int clientId;
typedef struct{
int scanRate;
string socketAddr;
}clientInfo;
int main(int argc,char** argv)
{
typedef map<clientId,clientInfo> clientEdp;
typedef map<clientId,clientInfo>::const_iterator iterator;
clientEdp clients;
clientInfo client[100];
char* str=new char[10];
string strAddr("socket addr client ");
for(int i=0;i<100;i++)
{
client[i].scanRate=i+1;
//convert int to char*
itoa(i+1,str,10);
//concatenate strAddr and str
client[i].socketAddr=strAddr+str;
clients.insert(
make_pair(i+1,client[i]));
}
delete str;
clientId id=10;
iterator i=clients.find(id);
if(i!=clients.end()){
cout<<"clientId: "<<id
<<" exists in clients"<<endl;
}
else{
cout<<"clientId: "<<id
<<" doesn't exist in clients"<<endl;
}
}
#include<iostream>
#include<map>
#include<string>
using namespace std;
typedef int clientId;
typedef struct{
int scanRate;
string socketAddr;
}clientInfo;
int main(int argc,char** argv)
{
typedef map<clientId,clientInfo> clientEdp;
typedef map<clientId,clientInfo>::const_iterator iterator;
clientEdp clients;
clientId id=110;
clientInfo cltInfo;
cltInfo.scanRate=10;
cltInfo.socketAddr="110";
pair<clientId,clientInfo> p110(id,cltInfo);
pair<iterator,bool> p=clients.insert(p110);
if(p.second){
cout<<"insert success!"<<endl;
}
else{
cout<<"insert failed!"<<endl;
}
//i points to clients[110];
iterator i=p.first;
cout<<i->first<<endl;
cout<<i->second.scanRate<<endl;
cout<<i->second.socketAddr<<endl;
}
涓婇潰鎴戜滑鐪嬪嚭錛岃繖閲屾垜浠彃鍏ラ敭鍊煎鏄鍏堝0鏄庝竴涓敭鍊煎pair<clientId,clientInfo> p110(id,cltInfo); 鐒跺悗鍐嶆彃鍏ワ紝榪欎釜鎴戜滑涔嬪墠make_pair鏂規(guī)硶涓嶄竴鏍鳳紝make_pair鏂規(guī)硶鐢ㄧ殑姣旇緝澶氥?/p>
鍓嶉潰鎴戜滑浠嬬粛浜?jiǎn)鍒╃敤map鐨勬彃鍏ユ柟娉昳nsert()錛屽0鏄庨敭鍊煎pair鎴杕ake_pair鐢熸垚閿煎鐒跺悗鎴戜滑鍙互杞繪澗鐨勫皢閿煎鎻掑叆map涓傚叾瀹瀖ap榪樻彁渚涗簡(jiǎn)鏇存柟渚跨殑鎻掑叆鎿嶄綔鍒╃敤涓嬫爣錛坰ubscripting錛孾]錛夋搷浣滐紝濡備笅錛?/p>
clientInfo cltInfo; cltInfo.scanRate=10; cltInfo.socketAddr="110"; clients[110]=cltInfo;
榪欐牱鎴戜滑灝卞彲浠ョ畝鍗曞湴灝嗛敭鍊煎鎻掑叆鍒癿ap涓簡(jiǎn)銆備笅鏍囨搷浣滃湪map涓紡榪欐牱瀹氫箟鐨勶細(xì)
template<class Key,class T,class Cmp=less<key>,
class A=allocator<pair<const Key,T>>
class std::map
{
//...
//access element with key k
mapped_type& operator[](const key_type& k);
//...
}
鎴戜滑鏉ュ垎鏋愪竴涓嬪簲鐢╗]鎿嶄綔錛屾彃鍏ラ敭鍊煎鐨勮繃紼嬶細(xì)媯(gè)鏌ラ敭k鏄惁宸茬粡鍦╩ap閲屻傚鏋滀笉錛屽氨娣誨姞涓婏紝浠浣滀負(fù)瀹冪殑瀵瑰簲鍊箋傚鏋渒宸茬粡鍦╩ap閲岋紝瀹冪殑鍏寵仈鍊艱鏇存柊鎴恦銆傝繖閲岄鍏堬紝鏌ユ壘110涓嶅湪map涓垯鍒涘緩涓涓敭涓?10鐨勯敭鍊煎錛屽茍灝嗘槧灝勫艱涓洪粯璁ゅ鹼紝榪欓噷scanRate涓?錛宻ocketAddr涓虹┖錛涚劧鍚庡皢鏄犲皠鍊艱祴涓篶ltInfo銆?濡傛灉110鍦╩ap涓凡緇忓瓨鍦ㄧ殑璇濓紝鍒欏彧鏄洿鏂頒互110涓洪敭鐨勬槧灝勫箋?/p>
浠庝笂闈㈢殑鍒嗘瀽鍙煡錛氬鏋滃ぇ閲忚繖鏍鋒彃鍏ユ暟鎹紝浼?xì)涓ラ噸濯?jiǎng)鍝嶆晥鐜囷紒濡傛灉浣犺冭檻鏁堢巼闂錛岃浣跨敤insert鎿嶄綔銆俰nsert鏂規(guī)硶錛岃妭鐪佷簡(jiǎn)涓夋鍑芥暟璋冪敤錛氫竴涓緩绔嬩復(fù)鏃剁殑榛樿鏄犲皠鍊肩殑瀵硅薄錛屼竴涓攢姣侀偅涓復(fù)鏃剁殑瀵硅薄鍜屼竴涓鏄犲皠鍊肩殑璧嬪兼搷浣溿?/p>
Note1錛?/strong>濡傛灉k宸茬粡瀛樺湪map涓紝[]鏁堢巼鍙嶈屾瘮insert鐨勬晥鐜囬珮錛岃屼笖鏇寸編瑙傦紒濡傛灉鑳藉鍏奸【榪欎袱鑰呴偅宀備笉鏄緢緹庡錛佸叾瀹炴垜浠噸鍐檓ap涓殑[]鎿嶄綔錛氶鍏堝垽鏂璳鏄惁宸茬粡鍦╩ap涓紝濡傛灉娌℃湁鍒欒皟鐢╥nsert鎿嶄綔錛屽惁鍒欒皟鐢ㄥ唴緗殑[]鎿嶄綔銆傚涓嬪垪浠g爜錛?/p>
Note2錛?/strong>鎴戜滑瑙嗕箮榪樺拷鐣ヤ簡(jiǎn)涓鐐癸紝濡傛灉鏄犲皠鍊糾apped value鐨勭被鍨嬫病鏈夐粯璁ゅ鹼紝鎬庝箞鍔烇紵榪欑鎯呭喌璇峰嬁浣跨敤[]鎿嶄綔鎻掑叆銆?/p>
閫氳繃[]鎿嶄綔涓嶄粎浠呮槸鎻掑叆閿煎錛屾垜浠篃鍙互閫氳繃閿甼ey媯(gè)绱㈠嚭鏄犲皠鍊糾apped value銆傝屼笖鎴戜滑鍒╃敤[]鎿嶄綔鍙互杞繪澗鍦扮粺璁′俊鎭紝濡傛湁榪欐牱榪欐牱涓浜涢敭鍊煎錛坆ook-name錛宑ount錛夊錛?/p>
(book1,1)銆?book2,2)銆?book1,2)銆?book3,1)銆?book3,5) 鎴戜滑璁$畻姣忕book鐨勬暟閲忔誨拰銆傛垜浠彲浠ヨ繖鏍峰仛錛氬皢瀹冧滑璇誨叆涓涓猰ap<string,int>錛?/p>
緇撴灉濡備笅鎵紺猴細(xì)錛堟敞鎰忔寜浣廲trl+z閿粨鏉熻緭鍏ワ級(jí) 鍥?銆佺▼搴忚繍琛岀粨鏋?/p>
鍓嶉潰浠嬬粛浜?jiǎn)map錛屽彲浠ヨ宸茬粡闈炲父娓呮櫚浜?jiǎn)銆傚鏋滃厑璁竎lientId閲嶅鐨勮瘽錛宮ap灝辨棤鑳戒負(fù)鍔涗簡(jiǎn)錛岃繖鏃跺欏氨寰梞ultimap涓婂満浜?jiǎn)锛?strong>multimap鍏佽閿甼ey閲嶅錛屽嵆涓涓敭瀵瑰簲澶氫釜鏄犲皠鍊箋?/strong>鍏跺疄闄ゆ涔嬪錛宮ultimap璺焟ap鏄緢鍍忕殑錛屾垜浠帴涓嬫潵鍦╩ap鐨勫熀紜涓婁粙緇峬ultimap銆?/p>
multimap鍦╯td涓殑瀹氫箟璺焟ap涓鏍峰彧鏄被鍚嶄負(fù)multimap錛宮ultimap鍑犱箮鏈塵ap鐨勬墍鏈夋柟娉曞拰綾誨瀷瀹氫箟銆?/p>
鍋囪鎴戜滑鎯沖彇鍑洪敭涓簁ey鐨勬墍鏈夋槧灝勫鹼紝鎴戜滑鍙互榪欐牱鍋氾細(xì) 錛堣鏄庯細(xì)瀹為檯涓婏紝涓鑸槸涓嶅厑璁竎lientId閲嶅鐨勶紝榪欓噷鍙槸涓轟簡(jiǎn)涓句緥銆傦級(jí)榪欐牱鏄笉鏄劅瑙夊緢涓戝憿錛佷簨瀹炰笂錛屾垜浠彲浠ユ洿綆鍗曠殑榪欐牱錛?/p>
map鏄竴綾誨叧鑱斿紡瀹瑰櫒銆傚畠鐨勭壒鐐規(guī)槸澧炲姞鍜屽垹闄よ妭鐐瑰榪唬鍣ㄧ殑褰卞搷寰堝皬錛岄櫎浜?jiǎn)閭d釜鎿嶄綔鑺傜偣锛屽鍏朵粬鐨勮妭鐐归兘娌℃湁浠涔堝獎(jiǎng)鍝嶃傚浜庤凱浠e櫒鏉ヨ錛屽彲浠ヤ慨鏀瑰疄鍊鹼紝鑰屼笉鑳戒慨鏀筴ey銆? map鐨勫姛鑳斤細(xì) 灞曟湜錛氭湰鏂囦笉鐭ヤ笉瑙夊啓浜?jiǎn)涓崬畱瀛椾簡(jiǎn)锛屼絾浠嶆湭娣卞叆娑夊強(qiáng)鍒癿ap瀹氫箟鐨勭3涓拰絎?涓弬鏁幫紝浣跨敤鐨勯兘鏄粯璁ゅ箋?/p>
template<class Key,class T,class Cmp=less<key>, 鎰熷叴瓚h咃紝璇鋒煡鎵劇浉鍏寵祫鏂檕r涓嬮潰鐣欒█甯屾湜鐪嬪埌鍗曠嫭寮綃囦粙緇峬ap絎?涓拰絎?涓弬鏁般傛?zhèn)ㄧ殑鏀寔锛屾垜鐨勫姩鍔涘Q丳S錛氬湪姝ゆ枃鐨勫師鍥狅紝鍦ㄤ笌鍏徃鍋氶」鐩敤鍒頒簡(jiǎn)map鐗規(guī)鎬葷粨鍑烘潵涓庡ぇ瀹跺叡浜紝涓嶈繃鍦ㄨ繘琛屼釜浜烘葷粨榪囩▼涓紝闅懼厤浼?xì)鏈夌枏婕忔垨涓嶅綋涔嬪锛岃涓嶅悵鎸囧嚭銆?/p>
銆?銆戙奣he C++ Programming Language (Special Edition)銆?/p>
銆?銆戙奅ffective STL銆?/p>//////////////////////////////////////////////
///@param MapType-map鐨勭被鍨嬪弬鏁?
///@param KeyArgType-閿殑綾誨瀷鍙傛暟
///@param ValueArgtype-鏄犲皠鍊肩殑綾誨瀷鍙傛暟
///@return 榪唬鍣紝鎸囧悜閿負(fù)k鐨勯敭鍊煎
//////////////////////////////////////////////
template<typename MapType,
typename KeyArgType,
typename ValueArgtype>
typename MapType::iterator
efficientAddOrUpdate(MapType& m,
const KeyArgType& k,
const ValueArgtype& v)
{
typename MapType::iterator Ib = m.lower_bound(k);
if(Ib != m.end()&&!(m.key_comp()(k,Ib->first))) {
//key宸茬粡瀛樺湪浜巑ap涓仛鏇存柊鎿嶄綔
Ib->second = v;
return Ib;
}
else{
//key涓嶅瓨鍦╩ap涓仛鎻掑叆鎿嶄綔
typedef typename MapType::value_type MVT;
return m.insert(Ib, MVT(k, v));
}
}
7銆乕]涓嶄粎鎻掑叆
#include<iostream>
#include<map>
#include<string>
using namespace std;
int main(int argc,char** argv)
{
map<string,int> bookMap;
string book;
int count;
int total=0;
while(cin>>book>>count)
bookMap[book]+=count;
map<string,int>::iterator i;
for(i=bookMap.begin();i!=bookMap.end();i++)
{
total+=i->second;
cout<<i->first<<'\t'<<i->second<<endl;
}
cout<<"total count:"<<total<<endl;
}
8銆乵ultimap
pair<iterator,iterator> equal_range(const key_type& k);
pair<const_iterator,const_iterator>
equal_range(const key_type& k) const;
//find first element with key k
iterator lower_bound(const key_type& k);
const_iterator lower_bound(const key_type& k) const;
//find first element with key greater than k
iterator upper_bound(const key_type& k);
const_iterator upper_bound(const key_type& k) const;
#include<iostream>
#include<map>
#include<string>
using namespace std;
typedef int clientId;
typedef struct{
int scanRate;
string socketAddr;
}clientInfo;
int main(int argc,char** argv)
{
typedef multimap<clientId,clientInfo> clientEdp;
typedef multimap<clientId,clientInfo>::const_iterator iterator;
clientEdp clients;
clientInfo client[20];
char* str=new char[10];
string strAddr("socket addr client ");
for(int i=0;i<10;i++)
{
client[i].scanRate=i+1;
//convert int to char*
itoa(i+1,str,10);
//concatenate strAddr and str
client[i].socketAddr=strAddr+str;
clients.insert(
make_pair(10,client[i]));
}
for(int i=10;i<20;i++)
{
client[i].scanRate=i+1;
//convert int to char*
itoa(i+1,str,10);
//concatenate strAddr and str
client[i].socketAddr=strAddr+str;
clients.insert(
make_pair(i+1,client[i]));
}
delete str,strAddr;
//find elements with key 10
iterator lb=clients.lower_bound(10);
iterator ub=clients.upper_bound(10);
for(iterator i=lb;i!=ub;i++)
{
cout<<"clientId:"<<i->first<<endl;
cout<<"scanRate:"<<i->second.scanRate<<endl;
cout<<"socketAddr:"<<i->second.socketAddr<<endl;
cout<<endl;
}
}
//find elements with key 10
pair<iterator,iterator> p=clients.equal_range(10);
for(iterator i=p.first;i!=p.second;i++)
{
cout<<"clientId:"<<i->first<<endl;
cout<<"scanRate:"<<i->second.scanRate<<endl;
cout<<"socketAddr:"<<i->second.socketAddr<<endl;
cout<<endl;
}
鎬葷粨
class A=allocator<pair<const Key,T>>鍙傝冩枃鐚細(xì)