锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
#ifndef聽_MYTEMPLATE_H_
#define聽_MYTEMPLATE_H_
template<typename聽_T>
class聽mytemplate{
聽聽聽聽T聽val;
public:
聽聽聽聽void聽display();
}
#include聽"mytemplate.cpp"
#endif
//聽鏂囦歡聽mytemplate.cpp
#ifdef聽_MYTEMPLATE_H_
template<typename聽T>
void聽mytemplate<T>::display(){
聽聽聽聽聽cout<<val<<endl;
}
#endif
榪欐牱鍋氱殑濂藉鏄垜鍙渶鏀瑰彉涓涓湴鏂瑰氨鍙互浣挎ā鏉挎湁涓嶅悓鐨勫疄鐜幫紝閬垮厤浜?br />鎶婁笉鍚岀殑瀹炵幇鏀懼湪鍚屼竴涓枃浠墮噷鏃墮毦浠ラ伩鍏嶇殑棰勭紪璇戞爣璁?閭d簺棰勭紪璇戞爣璁?br />甯稿父寰堥毦鐢紝鍥犱負璁頒綇瀹冧滑閮藉緢楹葷儲),鑰屼笖鏂囦歡鐭皬錛岄槄璇葷淮鎶よ搗鏉ユ洿
鏂逛究(涓涓緥瀛愭槸浣犻渶瑕佹瘮杈冩ā鏉跨殑涓嶅悓瀹炵幇鐨勭患鍚堟ц兘鏃?鎶婂畠鐨勫嚑涓疄鐜?br />閮藉啓鍒頒竴涓枃浠墮噷甯稿父浼氭妸浜烘悶緋婃秱).
涓嶇鎬庢牱鍋?紼嬪簭蹇呴』鍦ㄥ0鏄庢ā鏉垮疄渚嬩互鍓嶅氨"鐪嬭"浜嗘ā鏉跨殑瀹炵幇閮ㄥ垎
]]>
#include<map>
#include<string>
#include<iterator>
using namespace std;
typedef map<string,string>maps;
typedef pair<string,string>pr;
int main()
{
maps temp;
temp.insert(pr("aa","aaaaa"));
temp.insert(pr("bb","bbbbbb"));
temp.insert(pr("cc","cccc"));
maps tent;
maps::iterator it;
for(it=temp.begin();it!=temp.end();++it)tent.insert(*it);
for(it=tent.begin();it!=tent.end();++it)
{
cout<<(*it).first<<" "<<(*it).second<<endl;
}
return 0;
}
------杞澆娌愭灚's blog
鍦–/C++涓紝鏁版嵁鎸囬拡鏄渶鐩存帴錛屼篃鏈甯哥敤鐨勶紝鍥犳錛岀悊瑙h搗鏉ヤ篃姣旇緝瀹規槗銆傝屽嚱鏁版寚閽堬紝浣滀負榪愯鏃跺姩鎬佽皟鐢紙姣斿鍥炶皟鍑芥暟 CallBack Function錛夋槸涓縐嶅父瑙佺殑錛岃屼笖鏄緢濂界敤鐨勬墜孌碉紝涓嶈兘涓嶅ソ濂借璇嗕竴鐣?/P>
鎺ヤ笅鏉ワ紝鎴戜滑灝辮璁轟竴涓嬪嚱鏁版寚閽堛?BR>
2 甯歌鍑芥暟鎸囬拡(闅懼害: 3)
void(*fp)();
fp 鏄竴涓吀鍨嬬殑鍑芥暟鎸囬拡錛岀敤浜庢寚鍚戞棤鍙傛暟錛屾棤榪斿洖鍊肩殑鍑芥暟銆?BR> void(*fp2)(int);
fp2 涔熸槸涓涓嚱鏁版寚閽堬紝鐢ㄤ簬鎸囧悜鏈変竴涓暣鍨嬪弬鏁幫紝鏃犺繑鍥炲肩殑鍑芥暟銆?BR> 褰撶劧錛屾湁緇忛獙浜哄+涓鑸兘浼氬緩璁嬌鐢╰ypedef鏉ュ畾涔夊嚱鏁版寚閽堢殑綾誨瀷錛屽錛?BR> typedef void(* FP)();
FP fp3; // 鍜屼笂闈㈢殑fp涓鏍風殑瀹氫箟銆?BR> 鍑芥暟鎸囬拡涔嬫墍浠ヨ鍒濆鑰呯晱鎯э紝鏈涓昏鐨勫師鍥犳槸瀹冪殑鎷彿澶浜嗭紱鏌愪簺鐢ㄩ旂殑鍑芥暟鎸囬拡錛屽線寰浼氳浜洪櫡鍦ㄦ嫭鍙峰爢涓嚭涓嶆潵錛岃繖閲屽氨涓嶄婦渚嬩簡錛屽洜涓轟笉鏄湰鏂囪璁虹殑鑼冨洿錛泃ypedef 鏂規硶鍙互鏈夋晥鐨勫噺灝戞嫭鍙風殑鏁伴噺錛屼互鍙婄悊娓呭眰嬈★紝鎵浠ュ彈鍒版帹鑽愩傛湰鏂囨殏鏃跺彧鑰冭檻綆鍗曠殑鍑芥暟鎸囬拡錛屽洜姝ゆ殏涓嶇敤鍒皌ypedef銆?BR>
鍋囧鏈夊涓嬩袱涓嚱鏁幫細
void f1()
{
std::cout << "call f " << std::endl;
}
void f2(int a)
{
std::cout << "call f2( " << a << " )" << std::endl;
}
鐜板湪闇瑕侀氳繃鍑芥暟鎸囬拡鏉ヨ皟鐢紝鎴戜滑闇瑕佺粰鎸囬拡鎸囧畾鍑芥暟錛?BR> fp = &f1; // 涔熷彲浠ョ敤錛歠p = f1;
fp2= &f2; // 涔熷彲浠ョ敤錛歠p2= f2;
void (*fp3)() = &f1; // 涔熷彲浠ョ敤錛歷oid (*fp3)() = f1;
璋冪敤鏃跺涓嬶細
fp(); // 鎴?(*fp)();
fp2(1); // 鎴?(*fp2)(1);
fp3(); // 鎴?(*fp3)();
瀵逛簬姝や袱縐嶈皟鐢ㄦ柟娉曪紝鏁堟灉瀹屽叏涓鏍鳳紝鎴戞帹鑽愮敤鍓嶄竴縐嶃傚悗涓縐嶄笉浠呬粎鏄鎵撲簡閿洏錛岃屼笖涔熸崯澶變簡涓浜涚伒媧繪с傝繖閲屾殏涓斾笉璇村畠銆?BR>
C++寮鴻皟綾誨瀷瀹夊叏銆備篃灝辨槸璇達紝涓嶅悓綾誨瀷鐨勫彉閲忔槸涓嶈兘鐩存帴璧嬪肩殑錛屽惁鍒欒交鍒欒鍛婏紝閲嶅垯鎶ラ敊銆傝繖鏄竴涓緢鏈夌敤鐨勭壒鎬э紝甯稿父鑳藉府鎴戜滑鎵懼埌闂銆傚洜姝わ紝鏈夎瘑涔嬪+璁や負錛孋++涓殑浠諱綍涓澶栬鍛婇兘涓嶈兘蹇借銆傜敋鑷蟲湁浜烘彁鍑猴紝緙栬瘧鐨勬椂鍊欎笉鑳藉嚭鐜頒換浣曡鍛婁俊鎭紝涔熷氨鏄錛岃鍛婂簲璇ュ綋浣滈敊璇竴鏍峰鐞嗐?BR>
姣斿錛屾垜浠妸f1璧嬪肩粰fp2錛岄偅涔圕++緙栬瘧鍣?vc7.1)灝變細鎶ラ敊錛?BR> fp2 = &f1; // error C2440: 鈥?鈥?: 鏃犳硶浠庘渧oid (__cdecl *)(void)鈥濊漿鎹負鈥渧oid (__cdecl *)(int)鈥?BR> fp1 = &f1; // OK
榪欐牱錛岀紪璇戝櫒鍙互甯垜浠壘鍑虹紪鐮佷笂鐨勯敊璇紝鑺傜渷浜嗘垜浠殑鎺掗敊鏃墮棿銆侰++緙栬瘧鍣ㄦ鑷村姏浜庤繖涓鐐廣?BR>
鑰冭檻涓涓婥++鏍囧噯妯℃澘搴撶殑sort鍑芥暟錛?BR> // 蹇熸帓搴忓嚱鏁?BR> template
void sort(
RandomAccessIterator _First, // 闇鎺掑簭鏁版嵁鐨勭涓涓厓绱犱綅緗?BR> RandomAccessIterator _Last, // 闇鎺掑簭鏁版嵁鐨勬渶鍚庝竴涓厓绱犱綅緗紙涓嶅弬涓庢帓搴忥級
BinaryPredicate _Comp // 鎺掑簭浣跨敤鐨勬瘮杈冪畻娉?鍙互鏄嚱鏁版寚閽堛佸嚱鏁板璞$瓑)
);
姣斿錛屾垜浠湁涓涓暣鍨嬫暟緇勶細
int n[5] = {3,2,1,8,9};
瑕佸瀹冭繘琛屽崌搴忔帓搴忥紝鎴戜滑闇瀹氫箟涓涓瘮杈冨嚱鏁幫細
bool less(int a, int b)
{
return a < b; // 鎰熻阿緗戝弸鎸囧嚭絎旇涔嬪銆傚師涓?return a-b 鏄敊璇殑銆?BR> }
鐒跺悗鐢細
sort(n, n+5, less);
瑕佹槸鎯沖瀹冭繘琛岄檷搴忔帓搴忥紝鎴戜滑鍙鎹竴涓瘮杈冨嚱鏁板氨鍙互浜嗭細
bool great(int a, int b)
{
return b < a; // 鎰熻阿緗戝弸鎸囧嚭絎旇涔嬪銆傚師涓?return b-a 鏄敊璇殑銆?BR>
}
sort(n, n+5, great);
榪欐牱錛屼笉闇瑕佹敼鍙榮ort鍑芥暟鐨勫畾涔夛紝灝卞彲浠ユ寜浠繪剰鏂規硶榪涜鎺掑簭錛屾槸涓嶆槸寰堢伒媧伙紵
榪欑鐢ㄦ硶浠++鐨勬爣鍑嗘ā鏉垮簱(STL)涓潪甯告祦琛屻傚彟澶栵紝鎿嶄綔緋葷粺涓篃緇忓父浣跨敤鍥炶皟(CallBack)鍑芥暟錛屽疄闄呬笂錛屾墍璋撳洖璋冨嚱鏁幫紝鏈川灝辨槸鍑芥暟鎸囬拡銆?/P>
錛堥檮娉級
鏈枃涓負浜嗚鏄庡嚱鏁版寚閽堬紝浣跨敤浜唋ess鍜実reat榪欎袱涓嚱鏁般傚湪C/C++鐨勬爣鍑嗘ā鏉垮簱涓凡緇忔湁鐩稿簲鐨勫嚱鏁板彲浠ョ洿鎺ヤ嬌鐢紝涓嶉渶瑕佽嚜宸插畾涔夈?BR>
------杞澆娌愭灚's blog
鎸囬拡錛屽湪C/C++璇█涓竴鐩存槸寰堝彈瀹犵殑錛涘嚑涔庢壘涓嶅埌涓涓笉浣跨敤鎸囬拡鐨凜/C++搴旂敤銆傜敤浜庡瓨鍌ㄦ暟鎹拰紼嬪簭鐨勫湴鍧錛岃繖鏄寚閽堢殑鍩烘湰鍔熻兘銆傜敤浜庢寚鍚戞暣鍨嬫暟錛岀敤鏁存暟鎸囬拡(int*)錛涙寚鍚戞誕鐐規暟鐢ㄦ誕鐐規暟鎸囬拡(float*)錛涙寚鍚戠粨鏋勶紝鐢ㄥ搴旂殑緇撴瀯鎸囬拡(struct xxx *)錛涙寚鍚戜換鎰忓湴鍧錛岀敤鏃犵被鍨嬫寚閽?void*)銆?BR> 鏈夋椂鍊欙紝鎴戜滑闇瑕佷竴浜涢氱敤鐨勬寚閽堛傚湪C璇█褰撲腑錛?void*) 鍙互浠h〃涓鍒囷紱浣嗘槸鍦–++涓紝鎴戜滑榪樻湁涓浜涙瘮杈冪壒孌婄殑鎸囬拡錛屾棤娉曠敤(void*)鏉ヨ〃紺恒備簨瀹炰笂錛屽湪C++涓紝鎯蟲壘鍒頒竴涓氱敤鐨勬寚閽堬紝鐗瑰埆鏄氱敤鐨勫嚱鏁版寚閽堝彲鏄竴涓滀笉鍙兘浠誨姟鈥濄?BR>
C++鏄竴縐嶅己綾誨瀷鐨勮璦錛孋++鐨勭紪璇戝櫒鐨勫姛鑳芥槸寮哄ぇ鐨勶紝瀹冪殑鍏朵腑涓涓璁$洰鏍囷紝鏄敖鍔涗負紼嬪簭鎵懼嚭紼嬪簭涓彲鑳藉瓨鍦ㄧ殑闂錛涘洜姝わ紝C++瀵圭被鍨嬬殑鍖歸厤鏄潪甯鎬弗鏍肩殑銆傚湪C璇█涓紝浣犲彲浠ョ敤void*鏉ユ寚鍚戜竴鍒囷紱浣嗗湪C++涓紝void*騫朵笉鑳芥寚鍚戜竴鍒囷紝灝辯畻鑳斤紝涔熸病鏈夋剰涔夛紝鍥犱負瀹冧笉鑳藉府浣犲彂鐜伴棶棰橈紝姣斿錛岀敤鍑芥暟鎸囬拡璧嬪肩粰涓涓暟鎹寚閽堛?BR>
涓嬮潰鎴戜滑鏉ユ帰璁ㄤ竴涓嬶紝C++涓浣曞瓨鍌ㄥ悇縐嶇被鍨嬬殑鎸囬拡銆?BR>
1. 鏁版嵁鎸囬拡
鏁版嵁鎸囬拡鍒嗕負涓ょ錛氬父瑙勬暟鎹寚閽堝拰鎴愬憳鏁版嵁鎸囬拡
1.1 甯歌鏁版嵁鎸囬拡 (闅懼害: 1)
榪欎釜涓嶇敤璇存槑浜嗭紝鍜孋璇█涓鏍鳳紝寰堢畝鍗曪紝鐩存帴瀹氫箟銆佽祴鍊煎氨澶熶簡銆傚父瑙佺殑鏈夛細int*, double* 絳夌瓑銆?BR> 濡傦細
int value = 123;
int * pn = &value;
1.2 鎴愬憳鏁版嵁鎸囬拡 (闅懼害: 4)
鏈夊涓嬬殑緇撴瀯錛?BR> struct MyStruct
{
int key;
int value;
};
鐜板湪鏈変竴涓粨鏋勫璞?
MyStruct me;
鎴戜滑闇瑕?value 鎴愬憳鐨勫湴鍧錛屾垜浠彲浠ワ細
int * pValue = &me.value;
:) 娌′粈涔堥毦鐨勫鍚э紵
鎴戜滑鍋囪涓涓嬶紝鐜板湪鏈変竴涓粨鏋勭殑鎸囬拡錛?BR>
MyStruct* pMe = new MyStruct;
鐜板湪錛屾垜浠鍙栧緱 pMe涓?value 鐨勬寚閽堬紝瑕佹庝箞鍋氬憿錛?BR> int * ppValue = &pMe->value;
:) 榪欎粛鐒跺緢瀹規槗銆?BR>
褰撶劧浜嗭紝涓婇潰璁ㄨ鐨勪粛鐒舵槸灞炰簬絎竴縐嶈寖絳?---甯歌鏁版嵁鎸囬拡銆?BR>
濂戒簡錛屾垜浠幇鍦ㄩ渶瑕佷竴縐嶆寚閽堬紝瀹冩寚鍚慚yStruct涓殑浠諱竴鏁版嵁鎴愬憳錛岄偅涔堝畠搴旇鏄繖鏍風殑瀛愶細
int MyStruct::* pMV = &MyStruct::value;
鎴?BR> int MyStruct::* pMK = &MyStruct::key;
榪欑鎸囬拡鐨勭敤閫旀槸鐢ㄤ簬鍙栧緱緇撴瀯鎴愬憳鍦ㄧ粨鏋勫唴鐨勫湴鍧銆傛垜浠彲浠ラ氳繃璇ユ寚閽堟潵璁塊棶鎴愬憳鏁版嵁錛?BR> int value = pMe->*pMV; // 鍙栧緱pMe鐨剉alue鎴愬憳鏁版嵁銆?BR> int value = me.*pMK; // 鍙栧緱me鐨刱ey鎴愬憳鏁版嵁銆?BR>
涔熻鏈変漢浼氶棶浜嗭紝榪欑鎸囬拡鏈変粈涔堢敤錛?BR> 紜疄錛屾垚鍛樻寚閽堟湰鏉ュ氨涓嶆槸涓縐嶅緢甯哥敤鐨勬寚閽堛備笉榪囷紝鍦ㄦ煇浜涙椂鍊欒繕鏄緢鏈夌敤澶勭殑銆傛垜浠厛鏉ョ湅鐪嬩笅闈㈢殑涓涓嚱鏁幫細
int sum(MyStruct* objs, int MyStruct::* pm, int count)
{
int result = 0;
for(int i = 0; i < count; ++i)
result += objs[i].*pm;
return result;
}
榪欎釜鍑芥暟鐨勫姛鑳芥槸浠涔堬紝浣犺兘鐪嬫槑鐧藉悧錛熷畠鐨勫姛鑳藉氨鏄紝緇欏畾count涓狹yStruct緇撴瀯鐨勬寚閽堬紝璁$畻鍑虹粰瀹氭垚鍛樻暟鎹殑鎬誨拰銆傛湁鐐規嫍鍙e鍚э紵鐪嬬湅涓嬮潰鐨勭▼搴忥紝浣犱篃璁稿氨鏄庣櫧浜嗭細
MyStruct me[10] =
{
{1,2},{3,4},{5,6},{7,8},{9,10},{11,12},{13,14},{15,16},{17,18},{19,20}
};
int sum_value = sum(me, &MyStruct::value, 10);
//璁$畻10涓狹yStruct緇撴瀯鐨剉alue鎴愬憳鐨勬誨拰錛?sum_value 鍊?涓?110 (2+4+6+8+...+20)
int sum_key = sum(me, &MyStruct::key, 10);
//璁$畻10涓狹yStruct緇撴瀯鐨刱ey鎴愬憳鐨勬誨拰錛?nbsp; sum_key 鍊?涓?100 (1+3+5+7+...+19)
涔熻錛屼綘瑙夊緱鐢ㄥ父瑙勬寚閽堜篃鍙互鍋氬埌錛岃屼笖鏇存槗鎳傘侽k錛屾病闂錛?BR> int sum_value(MyStruct* objs, int count)
{
int result = 0;
for(int i = 0; i < count; ++i)
result += objs[i].value;
return result;
}
浣犳槸鎯寵繖涔堝仛鍚楋紵浣嗚繖涔堝仛錛屼綘鍙兘璁$畻value錛屽鏋滆綆梜ey鐨勮瘽錛屼綘瑕佸鍐欎竴涓嚱鏁般傛湁澶氬皯涓垚鍛橀渶瑕佽綆楃殑璇濓紝浣犲氨瑕佸啓澶氬皯涓嚱鏁幫紝澶氶夯鐑﹀晩銆?BR>