锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
······鏉℃16 璁頒綇80-20鍑嗗垯
澶х害20%鐨勪唬鐮佷嬌鐢ㄤ簡80%鐨勮祫婧愶紝紼嬪簭鐨勬暣浣撴ц兘鏄敱璇ョ▼搴忕殑涓灝忛儴鍒嗕唬鐮佹墍鍐沖畾鐨剘
鍙鐨勫姙娉曟槸浣跨敤紼嬪簭鍒嗘瀽鍣紙profiler錛夋潵鎵懼埌瀵艱嚧鎬ц兘鐡墮鐨勬嬁20%鐨勭▼搴弤
鑰屼笖瑕侀拡瀵歸犳垚鐡墮鐨勮祫婧愭潵浣跨敤鐩稿簲鐨勫垎鏋愬櫒~
······鏉℃17 鑰冭檻浣跨敤寤惰繜璁$畻
寤惰繜璁$畻錛?涔熷氨鏄鐭ラ亾紼嬪簭瑕佹眰緇欏嚭緇撴灉鐨勬椂鍊欐墠榪涜榪愮畻~ 寰堝ソ鐞嗚В錛屽拰鎿嶄綔緋葷粺涓殑cow copy on write 涓涓師鐞唦
鍥涗釜浣跨敤鍦烘櫙錛?/font>
~1~ 寮曠敤璁℃暟 錛?/font>
銆銆class String{…};
String s1 = “hello”;
String s2 = s1 ; //call string Copy ctor
閫氬父鎯呭喌涓嬶紝s2璧嬪煎悗浼氭湁涓涓猦ello鐨勬嫹璐濓紝鑰呴氬父闇瑕佷嬌鐢╪ew鎿嶄綔絎﹀垎閰嶅唴瀛橈紝涔嬪悗strcpys1
鐨勬暟鎹粰浠栵紝浣嗗鏋滀笅闈㈢殑鎿嶄綔濡備笅鐨勮瘽錛?/font>
cout << s1 ;
cout << s1 + s2;
榪欑鎯呭喌涓嬪鏋滃彧澧炲姞s1鐨勫紩鐢ㄨ鏁幫紝鑰宻2鍙槸鍏變韓s1鐨勫煎氨鍙互浜嗐傚彧鏈夊湪闇瑕佸s2榪涜淇敼鎴栬卻1榪涜淇敼鏃訛紝鎵嶉渶瑕佺湡姝f嫹璐濈粰s2涓涓壇鏈紝寮曠敤璁℃暟鐨勫疄鐜板湪29鏉℃
~2~鍖哄垎璇誨啓鎿嶄綔
濡傦細 String s = “homer’s all”;
cout<< s[3];
s[3] = ‘x’;
鍦ㄨ繘琛岃鎿嶄綔鏃訛紝浣跨敤寮曠敤璁℃暟鏄紑閿寰堝皬鐨勶紝鐒惰屽啓鎿嶄綔蹇呴』鐢熸垚鏂扮殑鎷瘋礉銆傞氳繃鏉℃30鐨勪唬鐞嗙被鎴戜滑鍙互鎶婂垽鏂鍐欐搷浣滄帹榪熷埌鎴戜滑鑳藉鍐沖畾鍝釜鏄紜搷浣滅殑鏃跺?/font>
~3~寤惰繜璇誨彇
鍋囪紼嬪簭浣跨敤浜嗗寘鍚澶氭暟鎹垚鍛樼殑澶у璞★紝榪欎簺瀵硅薄蹇呴』鍦ㄦ瘡嬈$▼搴忚繍琛岀殑鏃跺欎繚鐣欎笅鏉ワ紝鍥犳瀛樿繘浜嗘暟鎹簱銆傛煇浜涙椂鍊欎粠database涓彇鍑烘墍鏈夋暟鎹槸娌℃湁蹇呰鐨勶紝姣斿浠栧彧璁塊棶璇ュ璞′腑鐨勪竴涓暟鎹垚鍛樸傛鏃訛紝搴旇瀵瑰璞¤繘琛屽鐞嗭紝鍙湁瀵硅薄鍐呴儴鏌愪竴涓壒瀹氱殑鏁版嵁鎴愬憳琚闂殑鏃跺欐墠鎶婁粬鍙栧嚭鏉ャ傜被浼間簬os涓殑鎸夐渶鎹㈤〉~
class LargeObject{
LargeObject(ObjectID id);
const string& field1() const;
int field2() const;
double field3() const;
const string& field4() const;
private:
ObjectID id;
mutable string* field1value;
mutable int * fieldValue;
};
LargeObject::LargeObject(ObjectID id):oid(id),fieldValue(0),…{}
const string& LargeObject::field1()const{
if(fieldValue == 0){
//read the data for field 1 from database and make field1 point to it
}
return *field1Value;
}
瀹炴柦lazy fetching 浠諱綍鎴愬憳鍑芥暟閮介渶瑕佸垵濮嬪寲絀烘寚閽堜互鎸囧悜鏈夋晥鏁版嵁銆備絾鏄痗onst鎴愬憳鍑芥暟涓紝璇曞浘淇敼鏁版嵁緙栬瘧鍣ㄤ細鎶ラ敊銆傛墍浠ュ0鏄庡瓧孌墊寚閽堜負 mutable 錛岃〃紺轟換浣曞嚱鏁伴兘鍙互淇敼,鍗充究鍦╟onst鎴愬憳鍑芥暟涓篃鍙互~ 鏉℃28涓殑鏅鴻兘鎸囬拡鍙互璁╄繖涓鏂規硶鏇寸伒媧?/font>
~3~寤惰繜琛ㄨ揪寮忔眰鍊?/font>
鏁板艱綆楅鍩燂紝涔熷湪浣跨敤寤惰繜璁$畻銆備緥濡?/font>
matrix<int> m1(1000,1000);
matrix<int> m2(1000,1000);
matrix<int> m3 = m1 + m2;
濡傛灉姝ゆ椂璁$畻鍑簃3鐨勮瘽榪愮畻閲忛潪甯鎬箣澶
浣嗘槸濡傛灉姝ゆ椂紼嬪簭涓猴細
m3 = m4*m1;
閭d箞鍒氭墠鐨勮綆楀氨娌″繀瑕佷簡
濡傛灉cout<< m3[4];
鎴戜滑鍙渶瑕佽綆梞3[4]灝卞彲浠ヤ簡錛屽叾浠栫殑鍊肩瓑鍒扮‘瀹為渶瑕佷粬浠殑鏃跺欐墠浜堜互璁$畻~濡傛灉榪愭皵澶熷ソ鐨勮瘽姘歌繙涓嶉渶瑕佽綆梸
鎬葷粨錛屽歡榪熻綆楀彧鏈夊綋杞歡鍦ㄦ煇縐嶇▼搴︿笅鍙互琚伩鍏嶆椂鍊欐墠鏈夋剰涔墌鍙湁寤惰繜璁$畻寰楀埌鐨勫ソ澶勫ぇ浜庤璁″畠涓庡疄鐜板畠鑺辮垂鐨勭簿鍔涙椂鎵嶆湁鎰忎箟~
·······鏉℃18錛?鍒嗘湡鎽婅繕棰勬湡鐨勮綆楀紑閿
鎻愬墠璁$畻~ over-eager evaluation 鍦ㄧ郴緇熻姹備綘鍋氭煇浜涗簨鎯呬箣鍓嶅氨鍋氫簡浠杶
渚嬪錛氬ぇ閲忔暟鎹殑闆嗗悎
template<class NumericalType>
class DataCollection}{
public:
NumericalType min() const;
NumericalType max() const;
NumericalType avg() const;
};
浣跨敤鎻愬墠璁$畻錛屾垜浠殢鏃惰窡韙洰鍓嶉泦鍚堢殑鏈澶ф渶灝忓鉤鍧囧鹼紝榪欐牱 min max avg琚皟鐢ㄦ椂鍊欙紝鎴戜滑鍙互涓嶇敤璁$畻绔嬪埢榪斿洖姝g‘鐨勬暟鍊紐~
鎻愬墠璁$畻鐨勬濇兂渚挎槸錛氬鏋滈璁℃煇涓綆椾細琚綣佽皟鐢紝浣犲彲浠ラ氳繃璁捐浣犵殑鏁版嵁緇撴瀯浠ユ洿楂樻晥鐨勫姙娉曞鐞嗚姹傦紝榪欐牱鍙互闄嶄綆姣忔璇鋒眰鐨勫鉤鍧囧紑閿~
鏈綆鍗曠殑鍋氭硶涓?緙撳瓨宸茬粡璁$畻榪囧茍涓斿緢鍙兘涓嶉渶瑕侀噸鏂拌綆楃殑閭d簺鍊紐
渚嬪鍦ㄦ暟鎹簱涓瓨鏈夊緢澶氬姙鍏鐨勭數璇濆彿鐮侊紝紼嬪簭鍦ㄦ瘡嬈℃煡璇㈢數璇濇椂鍏堟煡璇㈡湰鍦扮殑緙撳瓨濡傛灉娌℃壘鍒板啀鍘昏闂暟鎹簱錛屽茍涓旀洿鏂扮紦瀛橈紝榪欐牱浣跨敤緙撳瓨騫沖潎璁塊棶鏃墮棿瑕佸ぇ澶у噺灝忋?/font>
棰勫鐞嗕篃鏄竴縐嶇瓥鐣ャ?/font>
渚嬪璁捐鍔ㄦ佹暟緇勭殑鏃跺欙紝褰撶儲寮曚笅鏍囧ぇ浜庡凡鏈夋渶澶ц寖鍥存椂鍊欙紝闇瑕乶ew鍑烘柊鐨勭┖闂達紝濡傛灉鐢寵涓ゅ嶄簬绱㈠紩鐨勫ぇ灝忕殑璇濆氨鍙互閬垮厤棰戠箒鐨勭敵璇鋒搷浣渵~~
········鏉℃ 19 錛?浜嗚В涓存椂瀵硅薄鐨勬潵婧?/font>
濡傛灉涓涓璞¤鍒涘緩錛屼笉鏄湪鍫嗕笂錛屾病鏈夊悕瀛楋紝閭d箞榪欎釜瀵硅薄灝辨槸涓存椂瀵硅薄銆?/font>
閫氬父浜х敓浜庯細 涓轟簡浣垮嚱鏁拌皟鐢ㄨ兘澶熸垚鍔熻岃繘琛岀殑闅愬紡杞崲錛屾垨鑰呭嚱鏁拌繑鍥炲璞℃槸榪涜鐨勯殣寮忚漿鎹€傜敱浜庢瀯閫犲拰鏋愭瀯浠栦滑甯︽潵鐨勫紑閿鍙互緇欎綘鐨勭▼搴忓甫鏉ユ樉钁楃殑褰卞搷錛屽洜姝ゆ湁蹇呰浜嗚В浠栦滑~
~1棣栧厛鑰冭檻涓轟簡鍑芥暟璋冪敤鑳介氳繃浜х敓鐨勪復鏃跺璞$殑鎯呭喌
浼犵粰鏌愪釜鍑芥暟鐨勫璞$殑綾誨瀷鍜岃繖涓嚱鏁版墍緇戝畾鐨勫弬鏁扮被鍨嬩笉涓鑷寸殑鎯呭喌涓嬩細鍑虹幇榪欑鎯呭喌銆?/font>
渚嬪錛?/font>
size_t count(const string& str,char ch);
鍑芥暟瀹氫箟涓鴻綆梥tr涓璫h鐨勬暟閲?/font>
char buffer[100];
cout<<count(buffer,‘c’);
浼犲叆鐨勬槸涓涓猚har鏁扮粍錛屾鏃剁紪璇戝櫒浼氳皟鐢╯tr鐨勬瀯閫犲嚱鏁幫紝鍒╃敤buffer鏉ュ垱寤轟竴涓復鏃跺璞°?/font>
鍦ㄨ皟鐢ㄥ畬countChar璇彞鍚庤繖涓復鏃跺璞″氨琚嚜鍔ㄩ攢姣佷簡~
浠呭綋浼犲兼垨鑰卌onst寮曠敤鐨勬椂鍊欐墠浼氬彂鐢熻繖鏍風殑綾誨瀷杞崲~褰撲紶閫掍竴涓潪甯擱噺寮曠敤鐨勬椂鍊欙紝涓嶄細鍙戠敓銆?/font>
void uppercasify(string& str); //change all chars in str to upper case;
鍦ㄨ繖涓緥瀛愪腑浣跨敤char鏁扮粍灝變笉浼氭垚鍔焴
鍥犱負紼嬪簭浣滆呭0鏄庨潪甯擱噺寮曠敤涔熷氨鏄兂璁╁寮曠敤鐨勪慨鏀瑰弽鏄犲湪浠栧紩鐢ㄧ殑瀵硅薄韜笂錛屼絾鏄鏋滄鏃剁敓鎴愪簡涓存椂瀵硅薄錛岄偅涔堣繖浜涗慨鏀瑰彧鏄綔鐢ㄥ湪涓存椂瀵硅薄韜笂錛屼篃灝變笉鏄綔鑰呯殑鏈剰浜嗐傛墍浠++紱佹闈炲父閲忓紩鐢ㄤ駭鐢熶復鏃跺璞°?/font>
~2 鍑芥暟榪斿洖瀵硅薄鏃跺欎細浜х敓涓存椂瀵硅薄
渚嬪錛?const Number operator + ( const Number& lhs,const Number& rhs);
榪欎釜鍑芥暟榪斿洖涓涓復鏃跺璞★紝鍥犱負浠栨病鏈夊悕瀛楋紝鍙槸鍑芥暟鐨勮繑鍥炲箋?/font>
鏉℃20涓?錛屼細浠嬬粛璁╃紪璇戝櫒瀵瑰凡緇忚秴鍑虹敓瀛樺懆鏈熺殑涓存椂瀵硅薄榪涜浼樺寲
········鏉℃20錛?鍗忓姪緙栬瘧鍣ㄥ疄鐜拌繑鍥炲間紭鍖?/font>
榪斿洖鍊間紭鍖栵細榪斿洖甯︽湁鍙傛暟鐨勬瀯閫犲嚱鏁般?/font>
cosnt Rational operator * (cosnt Rational& lhs,const Rational& rhs){
return Rational(lhs.numerator()*rhs.numerator(),lhs.denomiator()*rhs.denominator()};
c++鍏佽緙栬瘧鍣ㄩ拡瀵硅秴鍑虹敓鍛藉懆鏈熺殑涓存椂瀵硅薄榪涜浼樺寲銆傚洜姝ゅ鏋滆皟鐢≧ational c=a*b錛?/font>
c++鍏佽緙栬瘧鍣ㄦ秷闄perator*鍐呴儴鐨勪復鏃跺彉閲忎互鍙妎perator*榪斿洖鐨勪復鏃跺彉閲忥紝緙栬瘧鍣ㄥ彲浠ユ妸return琛ㄨ揪寮忔墍瀹氫箟鐨勮繑鍥炲璞℃瀯閫犲湪鍒嗛厤緇檆鐨勫唴瀛樹笂銆傚鏋滆繖鏍峰仛鐨勮瘽閭d箞璋冪敤operator*鎵浜х敓鐨勪復鏃跺璞℃墍甯︽潵鐨勫紑閿灝辨槸0~ 鎴戜滑鍙互鎶妎perator 澹版槑涓哄唴鑱斿嚱鏁拌屽幓闄よ皟鐢ㄦ瀯閫犲嚱鏁板甫鏉ョ殑寮閿~
#include <iostream>
#include <string>
#include "time.h"
using namespace std;
char buffer[100];
class number{
public:
const friend number operator * (const number& rhs,const number lhs);
number(){}
number(int b):a(b){}
number(const number& rhs){
a = rhs.a;
}
int a;
};
const number operator*(const number& rhs,const number lhs){
number res;
res.a = rhs.a * lhs.a;
return res;
/*return number(rhs.a*lhs.a);*/
}
//CLOCKS_PER_SEC
int main()
{
clock_t start = clock();
number A(5);number B(6);
for(int i=0;i<100000000;i++)
number C = A*B;
clock_t end = clock();
cout<<double(end-start)/CLOCKS_PER_SEC<<endl;
}
閫氳繃涓婇潰鐨勭▼搴忚繍琛?濡傛灉娌℃湁榪斿洖鍊間紭鍖?榪愯鏃墮棿 15.9s 浼樺寲鍚庢槸 10.1s
榪樻槸寰堟樉钁楃殑涔?蹇簡33% 錛屽鏋滆繖縐嶆儏鍐靛嚭鐜板湪紼嬪簭鐨勭儹鐐瑰~鏁堟灉灝卞緢濂戒簡
·········鏉℃21 錛?閫氳繃鍑芥暟閲嶈澆閬垮厤闅愬紡綾誨瀷杞崲
渚嬪瓙錛?/font>
class upint{
public:
upint();
upint(int value);
};
cosnt upint operator+(const upint&lhs,const upint&rhs);
upint up1,up2;
upint up3 = up1+up2;
upi3 = up1 +10;
upi4 = 10+ upi2;
榪欎簺璇彞涔熷彲浠ラ氳繃錛屽洜涓哄垱寤轟簡涓存椂瀵硅薄錛岄氳繃甯︽湁int鐨勬瀯閫犲嚱鏁頒駭鐢熶簡涓存椂鐨剈pint瀵硅薄錛屽鏋滄垜浠笉鎰挎剰涓鴻繖浜涗復鏃跺璞$殑浜х敓涓庢瀽鏋勪粯鍑轟唬浠鳳紝鎴戜滑闇瑕佸仛浠涔堬細
鎴戜滑澹版槑 cosnt upint operator+(cosnt upint&lhs,int rhs);
cosnt upint operator+(int lhs,const upint& rhs);
灝卞彲浠ュ幓闄や復鏃跺璞′駭鐢熶簡~
浣嗘槸濡傛灉鎴戜滑鍐欎簡 const upint operator+(int lhs,int rhs); // 閿欎簡~
c++瑙勫畾錛屾瘡涓涓閲嶈澆鐨勮繍綆楃蹇呴』鑷沖皯鏈変竴涓弬鏁板睘浜庣敤鎴瘋嚜瀹氫箟綾誨瀷錛宨nt騫朵笉鏄嚜瀹氫箟綾誨瀷鎵浠ヤ笂闈㈢殑涓嶅鐨?/font>
鍚屾牱鐨勫鏋滃笇鏈泂tring char* 浣滀負鍙傛暟鐨勫嚱鏁幫紝閮芥湁鐞嗙敱榪涜閲嶈澆鑰岄伩鍏嶉殣褰㈢被鍨嬭漿鎹紙浠呬粎鍦ㄦ湁蹇呰鐨勬椂鍊欙紝涔熷氨鏄浠栦滑鍙互瀵圭▼搴忔晥鐜囪搗鍒板緢澶у府鍔╃殑鏃跺檦錛?/font>
··········鏉℃錛?鑰冭檻浣跨敤 op = 鏉ュ彇浠?鍗曠嫭鐨?op榪愮畻絎?/font>
class Rational{
public:
Rational& operator+=(const Rational& rhs);
Rational& operator-=(const Rational& rhs);
}
const Rational operator+(cosnt Rational& lhs,const Rational & rhs){
return Rational(lhs)+=rhs;
}
鍒╃敤+= -=鏉ュ疄鐜? -鍙互淇濊瘉榪愮畻絎︾殑璧嬪煎艦寮忎笌鍗曠嫭浣跨敤榪愮畻絎︿箣闂村瓨鍦ㄦ甯哥殑鍏崇郴銆?/font>
Rational a,b,c,d,result;
result = a+ b+c+d; // 鍙兘瑕佺敤鍒?涓復鏃跺璞?/font>
result +=a;result+=b;result+=c; //娌℃湁涓存椂瀵硅薄
鍓嶈呬功鍐欑淮鎶ら兘鏇村鏄擄紝鑰屼笖涓鑸潵璇存晥鐜囦笉瀛樺湪闂錛屼絾鏄壒孌婃儏鍐典笅鍚庤呮晥鐜囨洿楂樻洿鍙彇
娉ㄦ剰錛?/font>
濡傛灉+鐨勫疄鐜版槸榪欐牱鐨勶細
const T operator+ (constT& lhs,const T&rhs){
T result(lhs);
return result += rhs;
}
榪欎釜妯$増涓寘鍚湁鍚嶅瓧瀵硅薄result錛岃繖涓璞℃湁鍚嶅瓧鎰忓懗鐫榪斿洖鍊間紭鍖栦笉鍙敤~~~~~~~~·
·······鏉℃23 錛?鑰冭檻浣跨敤鍏朵粬絳変環鐨勭▼搴忓簱
涓繪棬錛?/font>
鎻愪緵綾諱技鍔熻兘鐨勭▼搴忓簱閫氬父鍦ㄦц兘闂涓婇噰鍙栦笉鍚岀殑鏉冭 鎺柦錛屾瘮濡俰ostream鍜宻tdio錛屾墍浠ラ氳繃鍒嗘瀽紼嬪簭鎵懼埌杞歡鐡墮涔嬪悗錛屽彲浠ヨ冭檻鏄惁閫氳繃鏇挎崲紼嬪簭搴撴潵娑堥櫎鐡墮~~~~
······鏉℃24 : 鐞嗚В铏氬嚱鏁幫紝澶氶噸緇ф壙錛岃櫄鍩虹被浠ュ強 RTTI 甯︽潵鐨勫紑閿
铏氬嚱鏁拌〃錛歷tabs 鎸囧悜铏氬嚱鏁拌〃鐨勬寚閽?vptrs
紼嬪簭涓瘡涓0鏄庝簡鎴栬呯戶鎵夸簡鐨勮櫄鍑芥暟鐨勭被閮藉叿鏈夎嚜宸辯殑铏氬嚱鏁拌〃銆傝〃涓殑鍚勪釜欏瑰氨鏄寚鍚戣櫄鍑芥暟鍏蜂綋瀹炵幇鐨勬寚閽堛?/font>
class c1{
c1();
virtual ~c1();
virtual void f1();
virtual int f2(char c)const;
virtual void f3(const string& s);
};
c1 鐨勮櫄鍑芥暟琛ㄥ寘鎷細 c1::~c1 c1::f1 c1::f2 c1::f3
class c2:public c1{
c2();
virtual ~c2();
virtual void f1();
virtual void f5(char *str);
};
瀹冪殑铏氬嚱鏁拌〃鍏ュ彛鎸囧悜鐨勬槸閭d簺鐢眂1澹版槑浣嗘槸c2娌℃湁閲嶅畾涔夌殑铏氬嚱鏁版寚閽堬細
c2::~c2 c2::f1 c1::f2 c1::f3 c2::f5
鎵浠ュ紑閿涓婏細 蹇呴』涓哄寘鍚櫄鍑芥暟鐨勭被鑵懼嚭棰濆鐨勭┖闂存潵瀛樻斁铏氬嚱鏁拌〃銆備竴涓被鐨勮櫄鍑芥暟琛ㄧ殑澶у皬鍙栧喅浜庡畠鐨勮櫄鍑芥暟鐨勪釜鏁幫紝铏界劧姣忎竴涓被鍙鏈変竴涓櫄鍑芥暟琛紝浣嗘槸濡傛灉鏈夊緢澶氱被鎴栬呮瘡涓被鍏鋒湁寰堝涓櫄鍑芥暟錛岃櫄鍑芥暟琛ㄤ篃浼氬崰鎹緢澶х殑絀洪棿錛岃繖涔熸槸mfc娌℃湁閲囩敤铏氬嚱鏁板疄鐜版秷鎭満鍒剁殑涓涓師鍥犮?/font>
鐢變簬姣忎竴涓被鍙渶瑕佷竴涓獀tbl鐨勬嫹璐濓紝鎶婂畠鏀懼湪鍝噷鏄竴涓棶棰橈細
涓縐嶏細涓烘瘡涓涓渶瑕乿tbl鐨勭洰鏍囨枃浠剁敓鎴愭嫹璐濓紝鐒跺悗榪炴帴鏃跺彇鍑洪噸澶嶆嫹璐?/font>
鎴栬咃細鏇村父瑙佺殑鏄噰鐢ㄨ瘯鎺㈡х畻娉曞喅瀹氬摢涓涓洰鏍囨枃浠跺簲璇ュ寘鍚被鐨剉tbl銆傝瘯鎺細涓涓被鐨剉tbl閫氬父浜х敓鍦ㄥ寘鍚綾葷涓涓潪鍐呰仈錛岄潪綰櫄鍑芥暟瀹氫箟鐨勭洰鏍囨枃浠墮噷銆傛墍浠ヤ笂闈1綾葷殑vtbl灝嗘斁鍦╟1::~c1 瀹氫箟鐨勭洰鏍囨枃浠墮噷銆傚鏋滄墍鏈夎櫄鍑芥暟閮藉0鏄庝負鍐呰仈錛岃瘯鎺㈡х畻娉曞氨浼氬け璐ワ紝鍦ㄦ瘡涓涓洰鏍囨枃浠跺氨浼氭湁vtbl銆傛墍浠ヤ竴鑸拷鐣ヨ櫄鍑芥暟鐨刬nline鎸囦護銆?/font>
濡傛灉涓涓被鍏鋒湁铏氬嚱鏁幫紝閭d箞榪欎釜綾葷殑姣忎竴涓璞¢兘浼氬叿鏈夋寚鍚戣繖涓櫄鍑芥暟琛ㄧ殑鎸囬拡錛岃繖鏄竴涓殣钘忔暟鎹垚鍛榲ptr~琚紪璇戝櫒鍔犲湪鏌愪竴涓綅緗?/font>
姝ゅ絎簩涓紑閿錛氫綘蹇呴』鍦ㄦ瘡涓涓璞′腑瀛樻斁涓涓澶栫殑鎸囬拡~
濡傛灉瀵硅薄寰堝皬榪欎釜寮閿灝卞崄鍒嗘樉钁梸~鍥犱負姣斾緥澶
姝ゆ椂 void makeCall(c1* pc1){
pc1->f1();
}
緲昏瘧涓?(*pc1->vptr[i])(pc1);
鏍規嵁vptr鎵懼埌vtbl 榪欏緢綆鍗曪紝
鍦╲tbl鎵懼埌璋冪敤鍑芥暟瀵瑰簲鐨勫嚱鏁版寚閽堬紝榪欎釜姝ラ涔熷緢綆鍗曪紝鍥犱負緙栬瘧鍣ㄤ負铏氬嚱鏁拌〃閲岀殑姣忎竴涓嚱鏁拌緗簡鍞竴鐨勭儲寮?/font>
鐒跺悗璋冪敤鎸囬拡鎵鎸囧悜鐨勫嚱鏁皛
榪欐牱鐪嬫潵錛岃皟鐢ㄨ櫄鍑芥暟涓庢櫘閫氬嚱鏁拌皟鐢ㄧ殑鏁堢巼鐩稿樊鏃犲嚑錛屽彧澶氬嚭鍑犱釜鎸囦護銆?/font>
铏氬嚱鏁扮湡姝g殑寮閿涓庡唴鑱斿嚱鏁版湁鍏硚錛氬湪瀹為檯搴旂敤涓紝铏氬嚱鏁頒笉搴旇琚唴鑱旓紝鍥犱負鍐呰仈鎰忓懗鐫鍦ㄧ紪璇戞椂鍒葷敤琚皟鐢ㄥ嚱鏁扮殑鍑芥暟浣撴潵浠f浛琚皟鐢ㄥ嚱鏁般備絾鏄櫄鍑芥暟鎰忓懗鐫榪愯鏃跺埢鍐沖畾璋冪敤鍝釜涓鍑芥暟錛宻o~~~铏氬嚱鏁頒粯鍑虹殑絎笁涓唬浠峰晩錛殈涓嶈兘鍐呰仈錛堥氳繃瀵硅薄璋冪敤铏氬嚱鏁扮殑鏃跺欙紝榪欎簺铏氬嚱鏁板彲浠ュ唴鑱旓紝浣嗘槸澶у鏁拌櫄鍑芥暟閫氳繃鎸囬拡鎴栬呬互鐢ㄦ潵璋冪敤鐨勶級銆?/font>
~澶氶噸緇ф壙鐨勬儏鍐?/font>
澶氶噸緇ф壙涓鑸姹傝櫄鍩虹被銆傛病鏈夎櫄鍩虹被錛屽鏋滀竴涓淳鐢熺被鍏鋒湁澶氫釜閫氬悜鍩虹被鐨勭戶鎵胯礬寰勶紝鍩虹被鐨勬暟鎹垚鍛樹細琚鍒跺埌姣忎竴涓戶鎵跨被瀵硅薄閲岋紝緇ф壙綾諱笌鍩虹被闂寸殑姣忎竴鏉¤礬寰勯兘鏈変竴涓嫹璐濄?/font>
鏈変簡铏氬熀綾伙紝閫氬父浣跨敤鎸囧悜铏氬熀綾葷殑鎸囬拡浣滀負閬垮厤閲嶅鐨勬墜孌碉紝榪欐牱闇瑕佸湪瀵硅薄鍐呴儴宓屽叆涓涓垨鑰呭涓寚閽垀涔熷甫鏉ヤ簡涓瀹氱殑寮閿~
渚嬪鑿卞艦緇ф壙 錛?
class A{};
class B:virtual public A{};
class C:virtual public A{};
class D:public B,public C{};
榪欓噷A鏄竴涓櫄鍩虹被錛屽洜涓築鍜孋铏氭嫙緇ф壙浜嗕粬銆?/font>
瀵硅薄 D 鐨勫竷灞錛?/font>
B data
vptr
pointer to virtual base class
C data
vptr
pointer to virtual base class
D data members
A data members
vptr
涓婇潰鍥涗釜綾伙紝鍙湁涓変釜vptr錛屽洜涓築鍜孌鍙互鍏變韓涓涓獀ptr 錛堜負鍟ワ紵錛?/font>
鐜板湪鎴戜滑宸茬粡鐪嬪埌铏氬嚱鏁板浣曚嬌瀵硅薄鍙樺緱鏇村ぇ錛屼互鍙婁負浣曚笉鑳芥妸瀹冨唴鑱斾簡~
涓嬮潰鎴戜滑鐪嬬湅RTTI鐨勫紑閿 runtime type identifycation 鎵闇瑕佺殑寮閿
閫氳繃rtti鎴戜滑鍙互鐭ラ亾瀵硅薄鍜岀被鐨勬湁鍏充俊鎭紝鎵浠ヨ偗瀹氬湪鏌愪釜鍦版柟瀛樺偍浜嗚繖浜涗緵鎴戜滑鏌ヨ鐨勪俊鎭紝榪欎簺淇℃伅琚瓨鍌ㄥ湪type_info 綾誨瀷鐨勫璞¢噷錛屼綘鍙互閫氳繃typeid榪愮畻絎﹁闂竴涓被鐨則ype_info瀵硅薄銆?/font>
姣忎釜綾諱粎浠呴渶瑕佷竴涓猂TTI鐨勬嫹璐濓紝瑙勮寖涓婂彧淇濊瘉鎻愪緵鍝簺鑷沖皯鏈変竴涓櫄鍑芥暟鐨勫璞$殑鍑嗙‘鐨勫姩鎬佺被鍨嬩俊鎭瘇
why錛熷拰铏氬嚱鏁版湁鍟ュ叧緋粇 鍥犱負rtti璁捐鍦╲tbl閲?/font>
vtbl鐨勪笅鏍?鍖呭惈鎸囧悜type_info瀵硅薄鐨勬寚閽堛傛墍浠ヤ嬌鐢ㄨ繖縐嶅疄鐜版柟娉曪紝娑堣垂鐨勭┖闂存槸vtbl涓崰鐢ㄤ竴涓澶栫殑鍗曞厓鍐嶅姞涓婂瓨鍌╰ype_info瀵硅薄鎵闇瑕佺殑絀洪棿銆?/font>
------------------------緗伓鐨勭粨鏉熺嚎 OVER~------------------------------------------
瀛︿範涓涓嬫柇璦鍚э細
·······浠涔堟槸鏂█
鍦ㄦ煇澶勫垽鏂煇涓涓〃杈懼紡鐨勫間負鐪熸垨鑰呭亣錛屽鏋滃亣鍒欒緭鍑洪敊璇秷鎭茍鍋滄紼嬪簭鐨勬墽琛寏
assert鏄畯錛岃屼笉鏄嚱鏁幫紝鍙湪debug鐗堟湰涓湁鏁堬紝鍥犳鏃犻渶鍦╮elease鐗堟湰鍒犻櫎銆?/font>
·······鍝嚑縐嶆柇璦
MFC
ASSERT
void foo(char* p,int size)
{
ASSERT(p != 0); // 楠岃瘉緙撳啿鍖烘寚閽?br>ASSERT((size >= 100); // 紜緙撳啿鍖哄ぇ灝忚嚦灝戜負100瀛楄妭
// foo 鍑芥暟鐨勫叾瀹冭綆楄繃紼?br>}
濡傛灉娌℃湁瀹氫箟_DEBUG棰勫鐞嗙錛屽垯璇ヨ鍙ヤ笉浼氱湡姝g敓鎴愪唬鐮併俈isual C++浼氬湪璋冭瘯妯″紡緙栬瘧鏃惰嚜鍔ㄥ畾涔塤DEBUG錛岃屽湪鍙戣妯″紡涓嬶紝璇ラ澶勭悊絎︽槸涓嶅瓨鍦ㄧ殑銆傚鏋滃畾涔変簡_DEBUG錛屽垯涓婅堪涓や釜鏂█鐢熸垚鐨勪唬鐮佺被濡傦細
//ASSERT(p != 0);
do
{
if(!(p != 0) && AfxAssertFailedLine(__FILE__, __LINE__))
AfxDebugBreak();
} while(0);
//ASSERT((size >= 100);
do
{
if(!(size >= 100) && AfxAssertFailedLine(__FILE__,__LINE__))
AfxDebugBreak();
}while(0);
ASSERT_KINDOF(classname,pObject); ASSERT_KINDOF(CDocument,pDocument);
媯楠宲Object鎸囧悜鐨勫璞℃槸classname綾葷殑涓涓璞℃垨鑰呭叾媧劇敓綾葷殑瀵硅薄
ASSERT_VALID(pObject); pObject 蹇呴』鏄竴涓淳鐢熶簬CObject綾葷殑綾誨璞★紝浼氳皟鐢ㄥ叾閲嶅啓鐨凙ssertValid鍑芥暟 錛屼緥濡?/font>
濡傛灉浣跨敤搴旂敤鍚戝鎴栫被鍚戝鐢熸垚鍩轟簬MFC鐨勭被錛岄氬父浼氬緱鍒癆ssertValid()鐨勯鏋訛紝鏈濂芥敼鍐欒繖浜涢鏋朵唬鐮佷互澧炲姞鏈鍩烘湰鐨勫畬鏁存ф鏌ャ備笅闈㈡槸涓涓吀鍨嬬殑渚嬪瓙錛岀被Sample浠嶤Object緇ф壙錛屽亣瀹氬畠鍚湁鑱屽憳鍚嶅瓧鍙婂叾钖按錛?
class Sample : public CObject
{
protected:
CString m_Name; // 鑱屽憳鍚嶅瓧
double m_Salary; // 钖按
public:
Sample(LPCTSTR name,double salary) : m_Name(name), m_Salary(salary) {}
#ifdef _DEBUG
virtual void AssertValid() const;
#endif
};
#ifdef _DEBUG
void Sample::AssertValid() const
{
CObject::AssertValid(); // 楠岃瘉鍩虹被
ASSERT(!m_Name.IsEmpty()); // 楠岃瘉鑱屽憳鍚嶅瓧
ASSERT(m_Salary > 0); // 楠岃瘉钖按
}
#endif
CRT assertion
_ASSERT 鍜?nbsp; _ASSERTE 鍚庝竴涓細鍦ㄥ嚭閿欐椂鍚屾椂鎵撳嵃鍑烘潯浠跺垽鏂彞
ANSI
assert()
娉ㄦ剰錛歛ssert鐢ㄤ簬媯嫻嬮潪娉曠殑杈撳叆錛屼絾鏄悎娉曠殑杈撳叆騫朵笉涓瀹氭槸姝g‘鐨勶紝渚嬪錛?/font>
int pB = (int*)malloc(sizeof(int)*1000);
assert(pB!=NULL) //閿欒鐨勪嬌鐢╝ssert 浠栦細鍦╮elease鐗堟湰澶辨晥~涔熷氨鏄assert涓嶅簲璇ュ紼嬪簭浜х敓鍓綔鐢?/font>
姝g‘鐨勫仛娉曪細
int pB = (int*) malloc(sizeof(int)*1000);
if(pB == NULL)
{
//閿欒澶勭悊
}
else{
}
鍙︿竴涓緥瀛愶細
void draw(){
CFigure* pF = getCF();
assert(pf!=NULL);
if(pf == NULL){}
else{
}
}
姝ゅ錛屽浜巊etCF鏉ヨ榪斿洖鍊間負NULL鏄潪娉曠殑錛屽鏋滀粬鐨勮繑鍥炲煎彲鑳戒負null灝辨病蹇呰鍔犱笂assert璇彞銆?/font>
鑰屼笅闈㈢殑if璇彞鍒欐槸涓轟簡闃叉release鐗堟湰鍑虹幇null鎸囬拡鐨勬儏鍐點?
VERIFY()
鐢變簬ASSERT浠呭湪紼嬪簭鐨勮皟璇曠増璧蜂綔鐢紝嫻嬭瘯琛ㄨ揪寮忔繪槸琚姩鐨勩備篃灝辨槸璇達紝瀹冧滑涓嶈兘鍖呭惈璧嬪箋佸閲忋佸噺閲忕瓑鐪熸鏀瑰彉鏁版嵁鐨勬搷浣溿備絾鏈夋椂鍊欐垜浠渶瑕侀獙璇佷竴涓富鍔ㄨ〃杈懼紡錛屾瘮濡傝祴鍊艱鍙ャ傝繖鏃跺彲浠ヤ嬌鐢╒ERIFY浠f浛ASSERT銆備笅闈㈡槸涓涓緥瀛愶細
void foo(char* p,int size)
{
char* q; // 鎸囬拡鐨勫壇鏈?br>VERIFY(q = p); // 鎷瘋礉鎸囬拡騫舵墽琛岄獙璇?br>ASSERT((size >= 100); // 紜繚緙撳啿鍖哄ぇ灝忚嚦灝戜負100瀛楄妭
// 鎵ц foo 鐨勫叾瀹冩搷浣?br>}
鍦ㄨ皟璇曟ā寮忎笅ASSERT鍜孷ERIFY鏄浉鍚岀殑銆備絾鍦╮elease妯″紡涓嬶紝VERIFY鑳藉緇х畫瀵硅〃杈懼紡姹傚鹼紙浣嗕笉鍐嶈繘琛屾柇璦媯楠岋級錛岃孉SSERT璇彞鍦ㄦ晥鏋滀笂灝卞鍚屽凡緇忓垹闄や簡涓鏍楓?
灝界鍦∕FC婧愪唬鐮佷腑鍙互鎵懼埌涓浜涘簲鐢╒ERIFY鐨勪緥瀛愶紝浣咥SSERT鐢ㄥ緱鏇翠負鏅亶銆備竴浜涚▼搴忓憳鎬繪槸瀹屽叏閬垮厤浣跨敤VERIFY錛屽洜涓轟粬浠凡緇忎範鎯簬浣跨敤琚姩鏂█銆傝璁頒綇錛屽鏋滃湪ASSERT璇彞涓嬌鐢ㄤ簡涓誨姩琛ㄨ揪寮忥紝緙栬瘧鍣ㄤ笉浼氬彂鍑轟換浣曡鍛娿傚湪鍙戣妯″紡涓嬬紪璇戞椂璇ヨ〃杈懼紡浼氳鐩存帴鍒犻櫎錛屼粠鑰屽鑷寸▼搴忚繍琛岀殑閿欒銆傜敱浜庡彂琛岀増紼嬪簭涓嶅惈璋冭瘯淇℃伅錛岃繖縐嶇被鍨嬬殑閿欒鏄緢闅炬壘鍒板師鍥犵殑銆?
紼嬪簭鍙互浣跨敤鍩虹被鐨勬寚閽?/font>鎴栬呭紩鐢ㄦ潵媯绱㈣繖浜涙寚閽堟垨寮曠敤鎵鎸囧璞$殑瀹為檯媧劇敓綾誨瀷
鏍囧噯搴撴彁渚涗簡涓や釜鎿嶄綔絎︼細
1. typeid 浠栧彲浠ヨ繑鍥炴寚閽堟垨鑰呭紩鐢ㄦ墍鎸囧悜瀵硅薄鐨勫疄闄呯被鍨?/font>
2. dynamic_cast 灝嗗熀綾葷被鍨嬬殑鎸囬拡鎴栧紩鐢ㄥ畨鍏ㄧ殑杞負媧劇敓綾葷殑鎸囬拡鎴栬呭紩鐢?nbsp;
瀵逛簬涓嶅甫铏氬嚱鏁扮殑綾誨湪緙栬瘧鏃舵湡鎵ц錛屽惁鍒欏湪榪愯鏈熼棿鎵ц
浣跨敤鏃舵満錛?/font>
鍩虹被鎸囬拡璋冪敤媧劇敓綾繪垚鍛樺嚱鏁扮殑璇濓紝涓鑸簲浣跨敤铏氬嚱鏁幫紝榪欐牱緙栬瘧鍣ㄤ細鏍規嵁瀵硅薄鐨勫疄闄呯被鍨嬫潵閫夋嫨姝g‘鐨勫嚱鏁般備絾鏄煇浜涙儏鍐典笅鏃犳硶浣跨敤铏氬嚱鏁幫紝閭d箞姝?/font>
鏃跺鏋滈渶瑕佷嬌鐢ㄥ熀綾繪寚閽堣皟鐢ㄦ淳鐢熺被鎴愬憳鍑芥暟渚塊渶瑕佷嬌鐢≧TTI寮哄埗杞崲錛岃屼笖蹇呴』媯鏌ヨ漿鎹㈡槸鍚︽垚鍔?/font>浜?/font>
(涓) Dynamic_cast
dynamic_cast 濡傛灉杞崲鍒版寚閽堝け璐ュ垯榪斿洖 0 濡傛灉杞崲鍒板紩鐢ㄧ被鍨嬪け璐ュ垯鎶涘嚭 bad_cast 寮傚父
瀵規寚閽堟搷浣滐細
if(Derived *derivedPtr = dynamic_cast<Derived*> (basePtr)){
//basePtr point to a derived object;
}else{
//basePtr point to a base object;
}
鍦?if 璇彞涓繘琛屾鏌?1.鏉′歡浠g爜鍐呴儴鐭ラ亾 derivedPtr 鐨勭被鍨?2.涓嶅彲鑳藉湪嫻嬭瘯浠g爜鍜屼嬌鐢ㄤ唬鐮佷腑鍔犲叆浠g爜錛屼篃灝辨槸璇翠笉浼氬湪娌℃湁嫻嬭瘯鍓嶅氨浣跨敤derivedPtr 3.濡傛灉澶辮觸澶栭儴涓嶄細浣跨敤鏈粦瀹氱殑鎸囬拡derivedPtr
瀵瑰紩鐢ㄦ搷浣滐細
鍥犱負涓嶅瓨鍦ㄧ┖寮曠敤鎵浠ヨ漿鎹㈠け璐ユ姏鍑哄紓甯?/font>
void f(const Base& b){
try{
const Derived &d = dynamic_cast<const Derived&> (b);
}catch(bad_cast){
}
}
(浜? typeid
typeid(e) e鏄換鎰忕殑琛ㄨ揪寮忔垨鑰呯被鍨嬪悕
Base *bp;
Derived *dp;
//compare type at run time of two objects
if(typeid(*bp)==typeid(*dp)){
//bp dp point to objects of the same type
}
if(typeid(*bp)==typeid(Derived)){
//bp actually point to a Derived
}
娉ㄦ剰typeid 嫻嬭瘯鐨勬槸 *bp 瀵硅薄
//test always fails: The type of bp if pointer to Base
if(typeid(bp)==typeid(Derived)){
}
Base* 灝嗘案榪滃拰Derived綾誨瀷涓嶅悓
鍙湁typeid 鐨勬搷浣滄暟鏄甫铏氬嚱鏁扮殑綾葷殑瀵硅薄鐨勬椂鍊欙紝鎵嶈繑鍥炲姩鎬佺被鍨嬩俊鎭紝嫻嬭瘯鎸囬拡榪斿洖鎸囬拡鐨勯潤鎬佺殑錛岀紪璇戞椂綾誨瀷
錛堜笁 錛塼ype_info 綾?/p>
浣滀負typeid鐨勮繑鍥炲?鎻愪緵
t1==t2 t1!=t2 t.name() 鐨勬搷浣?/p>
浣滀負搴旂敤渚嬪瓙錛屽彲浠ュ疄鐜頒竴涓被鍨嬫晱鎰熺殑鐩哥瓑鎿嶄綔絎?/p>
friend bool operator == (const base& lhs, const base& rhs){
return typeid(lhs)==typeid(rhs) && lhs.equal(rhs);
}
榪欐牱鍙互澶勭悊鍩虹被瀛愮被娣峰悎鐨勭浉絳夊垽鏂簡
涓涓璞$殑琛屼負鍙栧喅浜庝粬鐨勭姸鎬侊紝鑰屼笖瀹冨繀欏誨湪榪愯鏃舵牴鎹姸鎬佹敼鍙樹粬鐨勮涓恒傚父瑙勫疄鐜頒腑錛屼竴涓搷浣滃惈鏈夊簽澶х殑澶氬垎鏀殑鏉′歡璇彞錛屼笖榪欎簺鍒嗘敮渚濊禆浜庤瀵硅薄鐨勭姸鎬併傝繖涓姸鎬侀氬父浣跨敤涓涓垨鑰呭涓灇涓懼父閲忚〃紺恒係Tate妯″紡鎶婅繖浜涚姸鎬佹椂鍊欑殑瀵硅薄鐪嬪仛涓涓嫭绔嬬殑瀵硅薄錛屼篃灝辨槸灝嗕笉鍚岀姸鎬佹椂鐨勮涓哄垎鏁e埌鐩稿簲鐨勭姸鎬佺被涓傝杈懼埌榪欐牱鐨勬晥鏋滐紝闇瑕乧ontext錛屼篃灝辨槸鐘舵佺殑鎸佹湁鑰咃紝鍗沖師鍏堢殑綾伙紱鎶借薄鐘舵佺被錛屼粬灝佽浜嗕笌context浜や簰鐨勬帴鍙o紱鍏蜂綋鐘舵佺被錛屼篃灝辨槸涓涓釜鐨勫叿浣撶姸鎬併俢ontext涓繚瀛樹竴涓娊璞$姸鎬佺被瀵硅薄涓烘垚鍛橈紝騫禿elegate瀵硅薄琛屼負緇欎粬錛屼粠鑰屼嬌鐩稿簲鐘舵佷笅鐨勮涓轟唬鐮佺敓鏁堛傚鏋滅姸鎬佹敼鍙樼殑鍑嗗垯涓嶆槸鍥哄畾鐨勫垯state鐘舵佺被鍚屾椂搴旇閲嶅啓changestate綾諱互鎺у埗鐘舵佺殑鏀瑰彉錛屽惁鍒欏彲浠ュ湪context涓疄鐜般?/font>
鍏蜂綋鍒版垜浠殑欏圭洰錛?/font>
姣忎竴涓猟evice鍗充負context錛屼粬鎷ユ湁涓涓猻tate瀵硅薄錛宒evice涓殑鍑芥暟processMsg(){state->processMSg();} 鐢變簬鐘舵佹敼鍙樼殑瑙勫垯渚濊禆浜庢敹鍒扮殑娑堟伅錛屼篃灝辨槸璇翠竴涓姸鎬佸彲鑳借漿鎹㈠埌澶氫釜鐘舵乨evice鐨勬瘡涓姸鎬侀渶瑕侀噸鍐檚tatechange鏂規硶錛宻tateChange(){state->stateChange(this錛宮sg);} 榪欐牱錛屼笉鍚岀殑鐘舵佷笅鐨勮涓哄疄鐜板湪鍏蜂綋鐘舵佺殑綾諱腑錛屾瘮鍘熷厛鐨勭増鏈竻鏅版槑浜嗭紝鍙鎬ф洿寮恒?/font>
涓昏鍐呭 FIND-UNION ALGORITHM
灝辨槸鍒╃敤騫舵煡闆嗘潵鑰冨療榪為氭х殑綆楁硶 銆傛潯浠禢涓妭鐐癸紝M瀵硅妭鐐癸紝杈撳叆姣忎竴瀵硅妭鐐規椂鍊欙紝濡傛灉宸茬粡榪為氾紝鍒欏拷鐣ワ紝鍚﹀垯杈撳嚭鎺ョ偣騫舵洿鏂?
涓昏浠嬬粛涓夌綆楁硶錛氱涓縐嶏紝QUCK-FIND 鍒╃敤鏁扮粍璁板綍姣忎竴涓仈閫氬瓙鍥撅紝鍚屼竴涓仈閫氬瓙鍥劇殑鑺傜偣鏁扮粍鍙橀噺鏄浉鍚岀殑銆傚洜姝ゆ瘡璇誨叆涓瀵瑰氨闇瑕侀亶鍘哊涓暟緇勫彉閲忚冨療鏄惁闇瑕佹洿鏂幫紝鏈鍧忔椂闂碝N錛屽疄闄呬笂姣忎釜瀛愬浘涓洪珮搴︿負2鐨勬爲;絎簩縐嶏紝QUICK-UNION 鑱旈氬瓙鍥鵑渶瑕乽nion鏃?浠呬粎闇瑕佸皢涓や釜root union 鍥犳姣忎釜鑱旈氬瓙鍥鵑珮搴﹀彉楂橈紝鎵鏈塮ind root 浼氭秷鑰椾竴瀹氭椂闂達紝褰撶劧鏃犻渶閬嶅巻N浜?錛屾渶鍧忔椂闂達紝涔熷氨鏄瘡嬈″潎闇瑕佷粠鍙跺瓙鑺傜偣鍘誨洖婧眰鏍癸紙榪欓噷涔︿腑涓懼緱渚嬪瓙濂藉儚鏈夐棶棰橈級涔熸槸MN錛涚涓夌涔熷氨鏄?QUICK WEIGHT UNION 榪欑鏂規硶鍦ㄤ袱涓瓙鏍戝悎騫剁殑鏃跺欙紝涓嶆槸綆鍗曠殑鎸囧畾鍚堝茍絳栫暐錛岃屾槸緇忚繃鍒ゆ柇鐨勶紝鎶妔ize灝忥紙鐩稿簲楂樺害涔熷皬錛夌殑鍚堝茍鍒皊ize澶х殑閲岄潰錛涘疄闄呬笂寰堝鏄撶悊瑙e氨鏄敖閲忓噺灝戞爲鐨勯珮搴︽潵榪芥眰quick-find鐨勬晥鐜囷紱
榪涜屼綔鑰呭啓閬撹礬寰勫帇緙╋紝涔熸槸榪欑鎬濇兂銆傛垨鑰呭疄鐜頒負鍏ㄩ儴鍘嬬緝錛屼篃灝辨槸璇村湪榪涜union鎿嶄綔鐨勬椂鍊欙紝鎵鏈塩heck鐨勮妭鐐歸兘鐩存帴閾炬帴鍒皍nion鍚庣殑鏂皉oot涓嬮潰錛屾垨鑰卙alf union 錛堝鏄撳疄鐜頒笖鎬ц兘濂斤級姣忔check鏃跺欙紝濡傛灉娌℃湁鍋滄loop綆鍗曠殑浠?id[i]=id[id[i]];鍗沖彲杈懼埌鍑忓皯鍒版牴璺濈鐨勬晥鏋溿?
half union 鐨勪富瑕佷唬鐮侊細
int i,j; for(i=p;id[i]!=i;i=id[i]) id[i]=id[id[i]]; for(j=p;id[j]!=j;j=id[j]) id[j]=id[id[j]]; if(i==j)continue; if(size[i]>size[j]) id[j]=i,size[i]+=size[j]; else id[i]=j,size[j]+=size[i];
絎竴嬈$敤windows live writer 璇曡瘯鏁堟灉鍝~
| sign | exponent | mantissa | |
| single precision | 1 | 8 | 23 |
| double precision | 1 | 11 | 52 |