锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
榪欑瘒鏂囩珷鐨勭洰鐨勬槸涓轟簡浠嬬粛std::vector錛屽浣曟伆褰撳湴浣跨敤瀹冧滑鐨勬垚鍛樺嚱鏁扮瓑鎿嶄綔銆傛湰鏂囦腑榪樿璁轟簡鏉′歡鍑芥暟鍜屽嚱鏁版寚閽堝湪榪唬綆楁硶涓嬌鐢紝濡傚湪remove_if()鍜?/span>for_each()涓殑浣跨敤銆傞氳繃闃呰榪欑瘒鏂囩珷璇昏呭簲璇ヨ兘澶熸湁鏁堝湴浣跨敤vector瀹瑰櫒錛岃屼笖搴旇涓嶄細鍐嶅幓浣跨敤C綾誨瀷鐨勫姩鎬佹暟緇勪簡銆?/span>
Vector鎬昏
vector鏄?/span>C++鏍囧噯妯℃澘搴撲腑鐨勯儴鍒嗗唴瀹癸紝瀹冩槸涓涓鍔熻兘鐨勶紝鑳藉鎿嶄綔澶氱鏁版嵁緇撴瀯鍜岀畻娉曠殑妯℃澘綾誨拰鍑芥暟搴撱?/span>vector涔嬫墍浠ヨ璁や負鏄竴涓鍣紝鏄洜涓哄畠鑳藉鍍忓鍣ㄤ竴鏍峰瓨鏀懼悇縐嶇被鍨嬬殑瀵硅薄錛岀畝鍗曞湴璇達紝vector鏄竴涓兘澶熷瓨鏀句換鎰忕被鍨嬬殑鍔ㄦ佹暟緇勶紝鑳藉澧炲姞鍜屽帇緙╂暟鎹?/span>
涓轟簡鍙互浣跨敤vector錛屽繀欏誨湪浣犵殑澶存枃浠朵腑鍖呭惈涓嬮潰鐨勪唬鐮侊細
#include <vector> |
vector灞炰簬std鍛藉悕鍩熺殑錛屽洜姝ら渶瑕侀氳繃鍛藉悕闄愬畾錛屽涓嬪畬鎴愪綘鐨勪唬鐮侊細
using std::vector; vector<int> vInts; |
鎴栬呰繛鍦ㄤ竴璧鳳紝浣跨敤鍏ㄥ悕錛?/span>
std::vector<int> vInts; |
寤鴻浣跨敤鍏ㄥ眬鐨勫懡鍚嶅煙鏂瑰紡錛?/span>
using namespace std; |
鍦ㄥ悗闈㈢殑鎿嶄綔涓叏灞鐨勫懡鍚嶅煙鏂瑰紡浼氶犳垚涓浜涢棶棰樸?/span>vector瀹瑰櫒鎻愪緵浜嗗緢澶氭帴鍙o紝鍦ㄤ笅闈㈢殑琛ㄤ腑鍒楀嚭vector鐨勬垚鍛樺嚱鏁板拰鎿嶄綔銆?/span>
Vector鎴愬憳鍑芥暟
鍑芥暟 |
琛ㄨ堪 |
c.assign(beg,end) c.assign(n,elem) |
灝?/span>[beg; end)鍖洪棿涓殑鏁版嵁璧嬪肩粰c銆?/span> 灝?/span>n涓?/span>elem鐨勬嫹璐濊祴鍊肩粰c銆?/span> |
c.at(idx) |
浼犲洖绱㈠紩idx鎵鎸囩殑鏁版嵁錛屽鏋?/span>idx瓚婄晫錛屾姏鍑?/span>out_of_range銆?/span> |
c.back() |
浼犲洖鏈鍚庝竴涓暟鎹紝涓嶆鏌ヨ繖涓暟鎹槸鍚﹀瓨鍦ㄣ?/span> |
c.begin() |
浼犲洖榪唬鍣ㄩ噸鐨勫彲涓涓暟鎹?/span> |
c.capacity() |
榪斿洖瀹瑰櫒涓暟鎹釜鏁般?/span> |
c.clear() |
縐婚櫎瀹瑰櫒涓墍鏈夋暟鎹?/span> |
c.empty() |
鍒ゆ柇瀹瑰櫒鏄惁涓虹┖銆?/span> |
c.end() |
鎸囧悜榪唬鍣ㄤ腑鐨勬渶鍚庝竴涓暟鎹湴鍧銆?/span> |
c.erase(pos) c.erase(beg,end) |
鍒犻櫎pos浣嶇疆鐨勬暟鎹紝浼犲洖涓嬩竴涓暟鎹殑浣嶇疆銆?/span> 鍒犻櫎[beg,end)鍖洪棿鐨勬暟鎹紝浼犲洖涓嬩竴涓暟鎹殑浣嶇疆銆?/span> |
c.front() |
浼犲洖鍦頒竴涓暟鎹?/span> |
get_allocator |
浣跨敤鏋勯犲嚱鏁拌繑鍥炰竴涓嫹璐濄?/span> |
c.insert(pos,elem) c.insert(pos,n,elem) c.insert(pos,beg,end) |
鍦?/span>pos浣嶇疆鎻掑叆涓涓?/span>elem鎷瘋礉錛屼紶鍥炴柊鏁版嵁浣嶇疆銆?/span> 鍦?/span>pos浣嶇疆鎻掑叆n涓?/span>elem鏁版嵁銆傛棤榪斿洖鍊箋?/span> 鍦?/span>pos浣嶇疆鎻掑叆鍦?/span>[beg,end)鍖洪棿鐨勬暟鎹傛棤榪斿洖鍊箋?/span> |
c.max_size() |
榪斿洖瀹瑰櫒涓渶澶ф暟鎹殑鏁伴噺銆?/span> |
c.pop_back() |
鍒犻櫎鏈鍚庝竴涓暟鎹?/span> |
c.push_back(elem) |
鍦ㄥ熬閮ㄥ姞鍏ヤ竴涓暟鎹?/span> |
c.rbegin() |
浼犲洖涓涓嗗悜闃熷垪鐨勭涓涓暟鎹?/span> |
c.rend() |
浼犲洖涓涓嗗悜闃熷垪鐨勬渶鍚庝竴涓暟鎹殑涓嬩竴涓綅緗?/span> |
c.resize(num) |
閲嶆柊鎸囧畾闃熷垪鐨勯暱搴︺?/span> |
c.reserve() |
淇濈暀閫傚綋鐨勫閲忋?/span> |
c.size() |
榪斿洖瀹瑰櫒涓疄闄呮暟鎹殑涓暟銆?/span> |
c1.swap(c2) swap(c1,c2) |
灝?/span>c1鍜?/span>c2鍏冪礌浜掓崲銆?/span> 鍚屼笂鎿嶄綔銆?/span> |
vector<Elem> c vector <Elem> c1(c2) vector <Elem> c(n) vector <Elem> c(n, elem) vector <Elem> c(beg,end) c.~ vector <Elem>() |
鍒涘緩涓涓┖鐨?/span>vector銆?/span> 澶嶅埗涓涓?/span>vector銆?/span> 鍒涘緩涓涓?/span>vector錛屽惈鏈?/span>n涓暟鎹紝鏁版嵁鍧囧凡緙虹渷鏋勯犱駭鐢?/span>銆?/span> 鍒涘緩涓涓惈鏈?/span>n涓?/span>elem鎷瘋礉鐨?/span>vector銆?/span> 鍒涘緩涓涓互[beg;end)鍖洪棿鐨?/span>vector銆?/span> 閿姣佹墍鏈夋暟鎹紝閲婃斁鍐呭瓨銆?/span> |
Vector鎿嶄綔
鍑芥暟 |
鎻忚堪 |
operator[] |
榪斿洖瀹瑰櫒涓寚瀹氫綅緗殑涓涓紩鐢ㄣ?/span> |
鍒涘緩涓涓?/span>vector
vector瀹瑰櫒鎻愪緵浜嗗縐嶅垱寤烘柟娉曪紝涓嬮潰浠嬬粛鍑犵甯哥敤鐨勩?/span>
鍒涘緩涓涓?/span>Widget綾誨瀷鐨勭┖鐨?/span>vector瀵硅薄錛?/span>
vector<Widget> vWidgets; // ------ // | // |- Since vector is a container, its member functions // operate on iterators and the container itself so // it can hold objects of any type. |
鍒涘緩涓涓寘鍚?/span>500涓?/span>Widget綾誨瀷鏁版嵁鐨?/span>vector錛?/span>
vector<Widget> vWidgets(500); |
鍒涘緩涓涓寘鍚?/span>500涓?/span>Widget綾誨瀷鏁版嵁鐨?/span>vector錛屽茍涓旈兘鍒濆鍖栦負0錛?/span>
vector<Widget> vWidgets(500, Widget(0)); |
鍒涘緩涓涓?/span>Widget鐨勬嫹璐濓細
vector<Widget> vWidgetsFromAnother(vWidgets); |
鍚?/span>vector娣誨姞涓涓暟鎹?/span>
vector娣誨姞鏁版嵁鐨勭己鐪佹柟娉曟槸push_back()銆?/span>push_back()鍑芥暟琛ㄧず灝嗘暟鎹坊鍔犲埌vector鐨勫熬閮紝騫舵寜闇瑕佹潵鍒嗛厤鍐呭瓨銆備緥濡傦細鍚?/span>vector<Widget>涓坊鍔?/span>10涓暟鎹紝闇瑕佸涓嬬紪鍐欎唬鐮侊細
for(int i= 0;i<10; i++) vWidgets.push_back(Widget(i)); |
鑾峰彇vector涓埗瀹氫綅緗殑鏁版嵁
寰堝鏃跺欐垜浠笉蹇呰鐭ラ亾vector閲岄潰鏈夊灝戞暟鎹紝vector閲岄潰鐨勬暟鎹槸鍔ㄦ佸垎閰嶇殑錛屼嬌鐢?/span>push_back()鐨勪竴緋誨垪鍒嗛厤絀洪棿甯稿父鍐沖畾浜庢枃浠舵垨涓浜涙暟鎹簮銆傚鏋滀綘鎯崇煡閬?/span>vector瀛樻斁浜嗗灝戞暟鎹紝浣犲彲浠ヤ嬌鐢?/span>empty()銆傝幏鍙?/span>vector鐨勫ぇ灝忥紝鍙互浣跨敤size()銆備緥濡傦紝濡傛灉浣犳兂鑾峰彇涓涓?/span>vector v鐨勫ぇ灝忥紝浣嗕笉鐭ラ亾瀹冩槸鍚︿負絀猴紝鎴栬呭凡緇忓寘鍚簡鏁版嵁錛屽鏋滀負絀烘兂璁劇疆涓?/span>-1錛屼綘鍙互浣跨敤涓嬮潰鐨勪唬鐮佸疄鐜幫細
int nSize = v.empty() ? -1 : static_cast<int>(v.size()); |
璁塊棶vector涓殑鏁版嵁
浣跨敤涓ょ鏂規硶鏉ヨ闂?/span>vector銆?/span>
1銆?span> vector::at()
2銆?span> vector::operator[]
operator[]涓昏鏄負浜嗕笌C璇█榪涜鍏煎銆傚畠鍙互鍍?/span>C璇█鏁扮粍涓鏍鋒搷浣溿備絾at()鏄垜浠殑棣栭夛紝鍥犱負at()榪涜浜嗚竟鐣屾鏌ワ紝濡傛灉璁塊棶瓚呰繃浜?/span>vector鐨勮寖鍥達紝灝嗘姏鍑轟竴涓緥澶栥傜敱浜?/span>operator[]瀹規槗閫犳垚涓浜涢敊璇紝鎵鏈夋垜浠緢灝戠敤瀹冿紝涓嬮潰榪涜楠岃瘉涓涓嬶細
鍒嗘瀽涓嬮潰鐨勪唬鐮侊細
vector<int> v; v.reserve(10);
for(int i=0; i<7; i++) v.push_back(i);
try { int iVal1 = v[7]; // not bounds checked - will not throw int iVal2 = v.at(7); // bounds checked - will throw if out of range } catch(const exception& e) { cout << e.what(); } |
鎴戜滑浣跨敤reserve()鍒嗛厤浜?/span>10涓?/span>int鍨嬬殑絀洪棿錛屼絾騫朵笉娌℃湁鍒濆鍖栥傚涓嬪浘鎵紺猴細
浣犲彲浠ュ湪榪欎釜浠g爜涓皾璇曚笉鍚屾潯浠訛紝瑙傚療瀹冪殑緇撴灉錛屼絾鏄棤璁轟綍鏃朵嬌鐢?/span>at()錛岄兘鏄紜殑銆?/span>
鍒犻櫎vector涓殑鏁版嵁
vector鑳藉闈炲父瀹規槗鍦版坊鍔犳暟鎹紝涔熻兘寰堟柟渚垮湴鍙栧嚭鏁版嵁錛屽悓鏍?/span>vector鎻愪緵浜?/span>erase()錛?/span>pop_back()錛?/span>clear()鏉ュ垹闄ゆ暟鎹紝褰撲綘鍒犻櫎鏁版嵁鐨勬椂鍊欙紝浣犲簲璇ョ煡閬撹鍒犻櫎灝鵑儴鐨勬暟鎹紝鎴栬呮槸鍒犻櫎鎵鏈夋暟鎹紝榪樻槸涓埆鐨勬暟鎹傚湪鑰冭檻鍒犻櫎絳夋搷浣滀箣鍓嶈鎴戜滑闈欎笅鏉ヨ冭檻涓涓嬪湪STL涓殑涓浜涘簲鐢ㄣ?/span>
Remove_if()綆楁硶
鐜板湪鎴戜滑鑰冭檻鎿嶄綔閲岄潰鐨勬暟鎹傚鏋滆浣跨敤remove_if()錛屾垜浠渶瑕佸湪澶存枃浠朵腑鍖呭惈濡備笅浠g爜錛氾細
#include <algorithm> |
Remove_if()鏈変笁涓弬鏁幫細
1銆?span>
iterator _First錛氭寚鍚戠涓涓暟鎹殑榪唬鎸囬拡銆?/span>2銆?span>
iterator _Last錛氭寚鍚戞渶鍚庝竴涓暟鎹殑榪唬鎸囬拡銆?/span>3銆?span>
predicate _Pred錛氫竴涓彲浠ュ榪唬鎿嶄綔鐨勬潯浠跺嚱鏁般?/span>
鏉′歡鍑芥暟
鏉′歡鍑芥暟鏄竴涓寜鐓х敤鎴峰畾涔夌殑鏉′歡榪斿洖鏄垨鍚︾殑緇撴灉錛屾槸鏈鍩烘湰鐨勫嚱鏁版寚閽堬紝鎴栬呮槸涓涓嚱鏁板璞°傝繖涓嚱鏁板璞¢渶瑕佹敮鎸佹墍鏈夌殑鍑芥暟璋冪敤鎿嶄綔錛岄噸杞?/span>operator()()鎿嶄綔銆?/span>remove_if()鏄氳繃unary_function緇ф壙涓嬫潵鐨勶紝鍏佽浼犻掓暟鎹綔涓烘潯浠躲?/span>
渚嬪錛屽亣濡備綘鎯充粠涓涓?/span>vector<CString>涓垹闄ゅ尮閰嶇殑鏁版嵁錛屽鏋滃瓧涓蹭腑鍖呭惈浜嗕竴涓鹼紝浠庤繖涓煎紑濮嬶紝浠庤繖涓肩粨鏉熴傞鍏堜綘搴旇寤虹珛涓涓暟鎹粨鏋勬潵鍖呭惈榪欎簺鏁版嵁錛岀被浼間唬鐮佸涓嬶細
#include <functional> enum findmodes { FM_INVALID = 0, FM_IS, FM_STARTSWITH, FM_ENDSWITH, FM_CONTAINS }; typedef struct tagFindStr { UINT iMode; CString szMatchStr; } FindStr; typedef FindStr* LPFINDSTR; |
鐒跺悗澶勭悊鏉′歡鍒ゆ柇錛?/span>
class FindMatchingString : public std::unary_function<CString, bool> {
public: FindMatchingString(const LPFINDSTR lpFS) : m_lpFS(lpFS) {}
bool operator()(CString& szStringToCompare) const { bool retVal = false;
switch(m_lpFS->iMode) { case FM_IS: { retVal = (szStringToCompare == m_lpFDD->szMatchStr); break; } case FM_STARTSWITH: { retVal = (szStringToCompare.Left(m_lpFDD->szMatchStr.GetLength()) == m_lpFDD->szWindowTitle); break; } case FM_ENDSWITH: { retVal = (szStringToCompare.Right(m_lpFDD->szMatchStr.GetLength()) == m_lpFDD->szMatchStr); break; } case FM_CONTAINS: { retVal = (szStringToCompare.Find(m_lpFDD->szMatchStr) != -1); break; } }
return retVal; }
private: LPFINDSTR m_lpFS; }; |
閫氳繃榪欎釜鎿嶄綔浣犲彲浠ヤ粠vector涓湁鏁堝湴鍒犻櫎鏁版嵁錛?/span>
// remove all strings containing the value of // szRemove from vector<CString> vs.
FindStr fs; fs.iMode = FM_CONTAINS; fs.szMatchStr = szRemove;
vs.erase(std::remove_if(vs.begin(), vs.end(), FindMatchingString(&fs)), vs.end()); |
Remove_if()鑳藉仛浠涔堬紵
浣犲彲鑳戒細鐤戞儜錛屽浜庝笂闈㈤偅涓緥瀛愬湪璋冪敤remove_if()鐨勬椂鍊欒繕瑕佷嬌鐢?/span>erase()鍛紵榪欐槸鍥犱負澶у騫朵笉鐔熸倝STL涓殑綆楁硶銆?/span>Remove(),remove_if()絳夋墍鏈夌殑縐誨嚭鎿嶄綔閮芥槸寤虹珛鍦ㄤ竴涓凱浠h寖鍥翠笂鐨勶紝閭d箞涓嶈兘鎿嶄綔瀹瑰櫒涓殑鏁版嵁銆傛墍浠ュ湪浣跨敤remove_if()錛屽疄闄呬笂鎿嶄綔鐨勬椂瀹瑰櫒閲屾暟鎹殑涓婇潰鐨勩傛濊冧笂闈㈢殑渚嬪瓙錛?/span>
1銆?span>
szRemove = “o”.2銆?span> vs瑙佷笅闈㈠浘琛ㄤ腑鐨勬樉紺恒?br>
瑙傚療榪欎釜緇撴灉錛屾垜浠彲浠ョ湅鍒?/span>remove_if()瀹為檯涓婃槸鏍規嵁鏉′歡瀵硅凱浠e湴鍧榪涜浜嗕慨鏀癸紝鍦ㄦ暟鎹殑鍚庨潰瀛樺湪涓浜涙畫浣欑殑鏁版嵁錛岄偅浜涢渶瑕佸垹闄ょ殑鏁版嵁銆傚墿涓嬬殑鏁版嵁鐨勪綅緗彲鑳戒笉鏄師鏉ョ殑鏁版嵁錛屼絾浠栦滑鏄笉鐭ラ亾鐨勩?/span>
璋冪敤erase()鏉ュ垹闄ら偅浜涙畫浣欑殑鏁版嵁銆傛敞鎰忎笂闈緥瀛愪腑閫氳繃erase()鍒犻櫎remove_if()鐨勭粨鏋滃拰vs.enc()鑼冨洿鐨勬暟鎹?/span>
鍘嬬緝涓涓噧鑲跨殑vector
寰堝鏃跺欏ぇ閲忕殑鍒犻櫎鏁版嵁錛屾垨鑰呴氳繃浣跨敤reserve()錛岀粨鏋?/span>vector鐨勭┖闂磋繙榪滃ぇ浜庡疄闄呴渶瑕佺殑銆傛墍鏈夐渶瑕佸帇緙?/span>vector鍒板畠瀹為檯鐨勫ぇ灝忋?/span>resize()鑳藉澧炲姞vector鐨勫ぇ灝忋?/span>Clear()浠呬粎鑳藉鏀瑰彉緙撳瓨鐨勫ぇ灝忥紝鎵鏈夌殑榪欎簺瀵逛簬vector閲婃斁鍐呭瓨絳変節闈炲父閲嶈浜嗐傚浣曟潵瑙e喅榪欎簺闂鍛紝璁╂垜浠潵鎿嶄綔涓涓嬨?/span>
鎴戜滑鍙互閫氳繃涓涓?/span>vector鍒涘緩鍙︿竴涓?/span>vector銆傝鎴戜滑鐪嬬湅榪欏皢鍙戠敓浠涔堛傚亣瀹氭垜浠凡緇忔湁涓涓?/span>vector v錛屽畠鐨勫唴瀛樺ぇ灝忎負1000錛屽綋鎴戜滑璋冪敤size()鐨勬椂鍊欙紝瀹冪殑澶у皬浠呬負7銆傛垜浠氮璐逛簡澶ч噺鐨勫唴瀛樸傝鎴戜滑鍦ㄥ畠鐨勫熀紜涓婂垱寤轟竴涓?/span>vector銆?/span>
std::vector<CString> vNew(v); cout << vNew.capacity(); |
vNew.capacity()榪斿洖鐨勬槸7銆傝繖璇存槑鏂板垱寤虹殑鍙槸鏍規嵁瀹為檯澶у皬鏉ュ垎閰嶇殑絀洪棿銆傜幇鍦ㄦ垜浠笉鎯抽噴鏀?/span>v錛屽洜涓烘垜浠鍦ㄥ叾瀹冨湴鏂圭敤鍒板畠錛屾垜浠彲浠ヤ嬌鐢?/span>swap()灝?/span>v鍜?/span>vNew浜掔浉浜ゆ崲涓涓嬶紵
vNew.swap(v); cout << vNew.capacity(); cout << v.capacity(); |
鏈夎叮鐨勬槸錛?/span>vNew.capacity()鏄?/span>1000錛?/span>鑰?/span>v.capacity()鏄?/span>7銆?/span>
鐜板湪鏄揪鍒版垜鐨勭洰鐨勪簡錛屼絾鏄茍涓嶆槸寰堝ソ鐨勮В鍐蟲柟娉曪紝鎴戜滑鍙互鍍忎笅闈㈣繖涔堝啓錛?/span>
std::vector<CString>(v).swap(v); |
浣犲彲浠ョ湅鍒版垜浠仛浜嗕粈涔堬紵鎴戜滑鍒涘緩浜嗕竴涓復鏃跺彉閲忎唬鏇塊偅涓懡鍚嶇殑錛岀劧鍚庝嬌鐢?/span>swap(),榪欐牱鎴戜滑灝卞幓鎺変簡涓嶅繀瑕佺殑絀洪棿錛屽緱鍒板疄闄呭ぇ灝忕殑v銆?/span>
緇撹
鎴戝笇鏈涜繖涓枃妗e彲浠ョ粰閭d簺浣跨敤STL vector瀹瑰櫒鐨勫紑鍙戣呭緢鏈変環鍊肩殑鍙傝冦傛垜涔熷笇鏈涢氳繃闃呰榪欑瘒鏂囩珷浣犲彲浠ユ斁蹇冨湴浣跨敤vector鏉ヤ唬鏇?/span>C璇█涓殑鏁版嵁浜嗐?/span>
鍙傝?/span>
Plauger, P.J. Standard C++ Library Reference. February, 2003. MSDN.
Schildt, Herbert. C++ from the Ground Up, Second Edition.
Sutter, Herb. More Exceptional C++.