锘??xml version="1.0" encoding="utf-8" standalone="yes"?> Thunk鐨勫師鐞嗗叾瀹炶璧鋒潵寰堢畝鍗曪細宸у鐨勫皢鏁版嵁孌電殑鍑犱釜瀛楄妭鐨勬暟鎹涓虹壒孌婄殑鍊鹼紝鐒跺悗鍛婅瘔緋葷粺錛岃繖鍑犱釜瀛楄妭鐨勬暟鎹槸浠g爜錛堝嵆灝嗕竴涓嚱鏁版寚閽堟寚鍚戣繖鍑犱釜瀛楄妭鐨勭涓涓瓧鑺傦級錛岃緋葷粺鏉ユ墽琛?/font>銆?/span> 璁?font face="Times New Roman">API
鐩存帴鐢ㄦ垚鍛樺嚱鏁扮殑鍦板潃浼犵粰浣滀負API鐨勫洖璋冨嚱鏁版樉鐒朵細緙栬瘧鍑洪敊鐨勶紝鍘熷洜鏄粬浠殑璋冪敤瑙勫垯涓嶄竴鑷達紝C++緙栬瘧鍣ㄤ笉鍏佽榪欐牱鍋氥傚叿浣撳彲浠ュ弬鑰冿細
http://hi.baidu.com/shongbee2/blog/item/7867de9744e3c26155fb9611.html
鑰屽垰濂?font face="Times New Roman">THUNK鎶鏈氨鏄鏁版嵁孌靛綋鍋氫唬鐮佹柇鐢紝濡傛灉鎴戞妸鍥炶皟鍑芥暟鍦板潃鐢ㄤ竴涓暟鎹緇欎粬錛岀劧鍚庡湪鏁版嵁孌典腑鍐嶈煩杞埌鎴愬憳鍑芥暟鐨勫湴鍧銆傝繖鏍峰氨鍙互闂存帴鐨勮皟鐢ㄦ垚鍛樺嚱鏁頒簡銆備笉閿欙紝鎴戝氨鏄涔犵殑榪欎釜鏂規硶銆傚樆鍢匯傘?/font>
澶ц嚧鏂瑰悜鐭ラ亾浜嗭紝榪樺緱浜嗚В涓涓嬬粏鑺傦紝鍑芥暟璋冪敤鐨勮鍒欙細
寤鴻鐪嬩竴涓?/span>http://hi.baidu.com/shongbee2/blog/item/7867de9744e3c26155fb9611.html錛堜篃灝辨槸涓婁竴綃囨枃绔犲暒銆傦級闇瑕佹敞鎰忕殑錛氳皟鐢ㄨ呮庝箞澶勭悊鏍堬紝琚皟鐢ㄨ呮庝箞浣跨敤鏍堝拰澶勭悊鏍堛傜郴緇熷洖璋冨嚱鏁板熀鏈笂閮芥槸_stdcall鐨勮皟鐢ㄦ柟寮忥紝鎴愬憳鍑芥暟鏄?/font>__thiscall鐨勮皟鐢ㄦ柟寮忋備粬浠殑鍖哄埆涓猴細
|
鍏抽敭瀛?/span> |
鍫嗘爤娓呴櫎 |
鍙傛暟浼犻?/span> |
|
__stdcall |
琚皟鐢ㄨ?/span> |
灝嗗弬鏁板掑簭鍘嬪叆鍫嗘爤(鑷彸鍚戝乏) |
|
__thiscall |
琚皟鐢ㄨ?/span> |
鍘嬪叆鍫嗘爤錛?/span>this鎸囬拡淇濆瓨鍦?ECX 瀵勫瓨鍣ㄤ腑 |
鍙戠幇浠栦滑鍞竴涓嶅悓鐨勫氨鏄?font face="Times New Roman">__thiscall鎶?/font>this鎸囬拡淇濆瓨鍒頒簡ECX鐨勫瘎瀛樺櫒涓傚叾浠栭兘鏄竴鏍風殑銆傝繖縐嶆儏鍐墊垜浠氨鏂逛究浜嗭紝鎴戜滑鍙渶鍦ㄤ粬璋冪敤鎴戜滑鐨勬椂鍊欙紝鎴戜滑鍚?/font>this鎸囬拡淇濆瓨鍒?/font>ECX錛岀劧鍚庤煩杞埌鏈熸湜鐨勬垚鍛樺嚱鏁板湴鍧灝卞彲浠ヤ簡銆?/font>
//鎴戣涓烘濊礬灝辨槸榪欐牱浜嗐傛帴涓嬫潵鏄疄鐜幫紝璐存簮浠g爜錛?/font>
#include "stdafx.h"
#include "wtypes.h"
#include <iostream>
using namespace std;
typedef void (*FUNC)(DWORD dwThis);
typedef int (_stdcall *FUNC1)(int a, int b);
#pragma pack(push,1)
typedef struct tagTHUNK
{
BYTE bMovEcx; //MOVE ECX 灝唗his鎸囬拡縐誨姩鍒癊CX鐨勬寚浠?br> DWORD dwThis; // this this鎸囬拡鐨勫湴鍧
BYTE bJmp; //jmp 璺寵漿鎸囦護
DWORD dwRealProc; //proc offset 璺寵漿鍋忕Щ
void Init(DWORD proc,void* pThis)
{
bMovEcx = 0xB9; //娉ㄩ噴瑙佷笅闈㈣鏄巀_^
dwThis = (DWORD)pThis;
bJmp = 0xE9;
dwRealProc = DWORD((INT_PTR)proc - ((INT_PTR)this+sizeof(THUNK)));
FlushInstructionCache(GetCurrentProcess(),this,sizeof(THUNK));
}
}THUNK;
#pragma pack(pop)
/**************************************************************************************
void Init(DWORD proc,void* pThis)閲岄潰鐨勮鏄庯細
0xB9 涓篗OVE ECX鐨勬寚浠わ紝 0xE9 璺寵漿鐨勬寚浠わ紝榪欐鍒濆鍖栬〃紺猴細
0013FF54 mov ecx, ptr [this]
0013FF59 jmp dwRealProc
榪欎釜鍗曟涓涓嬩究鐭ャ?br>涓嬮潰閭d釜API 錛欶lushInstructionCache錛屾煡MSDN錛岃〃紺哄埛鏂扮紦瀛橈紝
鍥犱負鎴戜滑淇敼浜嗘暟鎹紝寤鴻浠栭噸鏂拌澆鍏ヤ竴涓嬨?/span>
鎴戞渶涓嶈兘鐞嗚В鐨勬槸jmp鐨勫亸縐繪槸涓轟粈涔堟槸閭f牱璁$畻錛屾墍浠ヨ繖閲屼篃鐫閲嶈鏄庝竴涓嬶細
jmp璺寵漿鐨勬槸褰撳墠鎸囦護鍦板潃鐨勫亸縐伙紝鎴戜滑鍙傛暟涓璸roc鏄疄闄呭嚱鏁扮殑鍦板潃錛屾垜浠渶瑕?br>鎶婁粬杞負jmp鐨勫亸縐? 瀹為檯鍑芥暟鍦板潃-jmp鎸囦護鍦板潃銆?br>瀹為檯鍑芥暟鍦板潃灝辨槸proc,jmp鍦板潃灝辨槸((INT_PTR)this+sizeof(THUNK))錛屾墍浠ュ氨寰楀埌
dwRealProc = DWORD((INT_PTR)proc - ((INT_PTR)this+sizeof(THUNK)));榪欒浠g爜
榪樻湁涓鐐癸紝鎴戝姹囩紪涓嶄簡瑙o紝涓嬮潰鏄痀Y錛氫負浠涔堜笉鏄細
dwRealProc = DWORD((INT_PTR)proc - ((INT_PTR)this+sizeof(THUNK)) - sizeof(dwRealProc))
鐩磋涓婄湅jmp鍦板潃涓嶆槸錛歵his + sizeof(bMoveEcx) + sizeof(dwThis) + sizeof(bJmp)鍚楋紵
涔熷氨鏄?(INT_PTR)this+sizeof(THUNK)) - sizeof(dwRealProc) 鍟娿傚彲鏄垜鐪嬩簡涓涓嬬紪璇戠殑緇撴灉錛?br>鍙戠幇0013FF59 jmp dwRealProc 鏄竴琛岀殑錛屼篃灝辨槸jmp鍦板潃瀹為檯灝辨槸:
((INT_PTR)this+sizeof(THUNK)) 榪欎釜鍦板潃銆傜粡榪囨祴璇曚篃娌℃湁闂錛屾垜灝辮涓烘槸榪欐牱浜嗭紝涓嶅鐨勮繕
蹇樺鎸囧嚭銆傚樆鍢匯?br>榪樻湁涓涓鏄撴販娣嗙殑錛屽氨鏄垜浠細浼犲叆this鎸囬拡錛屽湪dwRealProc閲岄潰鍜?FlushInstructionCache
閲岄潰閮界敤鍒頒簡this銆傝繖閲岃娉ㄦ剰鍟︼細濡傛灉浣犱笉鐭ラ亾浼犲叆鐨勫弬鏁皌his鎸囬拡鍜屼嬌鐢ㄧ殑榪欎釜this鐨勮瘽錛屼綘灝辮
閲嶆柊澶嶄範涓涓婥++鍩虹浜嗐傝В閲婁竴涓嬶細浼犲叆鐨則his鎸囬拡鍙樹負鍙傛暟pThis錛屼嬌鐢ㄧ殑this鏄疶HUNK鐨則his銆俕_^
*****************************************************************************************/
template<typename dst_type,typename src_type>
dst_type pointer_cast(src_type src)
{
return *static_cast<dst_type*>( static_cast<void*>(&src) );
}
class Test
{
public:
int m_nFirst;
THUNK m_thunk;
int m_nTest;
//鏋勯犲嚱鏁頒腑鍒濆鍖栦負3錛屼粎涓烘祴璇曪紝浠ヤ究鏌ョ湅澶栭潰鐨勬柟娉旿mpedTest鏄惁鍙互姝g‘鍙栧緱榪欎釜鍊?br> Test() : m_nTest(3),m_nFirst(4)
{}
void TestThunk()
{
m_thunk.Init(pointer_cast<int>(&Test::Test2),this);
FUNC1 f = (FUNC1)&m_thunk;
f(1,2);
cout << "Test::TestThunk()" << endl;
}
int Test2(int a, int b)
{
cout << a << " " << b << " " << m_nFirst << " " << m_nTest << endl;
return 0;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Test t;
t.TestThunk();
system("pause");
return 0;
}
鎬葷粨錛?/span>
榪欎釜鏄庢樉鏄毚鍔涚殑鍘誨己鍒惰煩杞紝鐩存帴鎶婃寚浠ゅ啓鍏ュ埌鏁版嵁孌典腑錛屽鍔犱簡鍑洪敊鐨勯闄╋紝鑰屼笖鍙Щ妞嶆у彉鐨勫緢宸傛墍浠ュ敖閲忓皯鐢ㄣ?/span>
瑕佸紕娓呮鍑芥暟璋冪敤瑙勫垯鍜屽爢鏍堢殑騫寵 銆傚鏋滀綘鐢?font face="Times New Roman">_cedcl瑙勫垯鐨勫嚱鏁拌皟鐢ㄧ殑璇濓紝灝變細鍑洪敊鍟︺?/font>
瀛︿範浠g爜涓彧鏄鐞嗕簡綆鍗曠殑鎯呭喌錛岃繕鏈夊嚑縐嶆柟寮忥紝渚嬪涓嶆槸寮哄埗璺寵漿錛岃屾槸鐢?font face="Times New Roman">call鐨勬柟寮忚皟鐢紝涔熷彲浠ュ疄鐜般傚浜庡叾浠栫殑鍑芥暟瑙勫垯渚嬪鎴愬憳鍑芥暟鏄?/font>_stdcall錛屼粬鏄弬鏁板帇鏍堢殑錛岃繖涓?/font>THUNK鐨勫啓娉曚篃涓嶄竴鏍蜂簡銆傘?/font>
鍥犱負鏁版嵁孌典腑鐢ㄥ埌浜?font face="Times New Roman">this,鍑芥暟鍥炶皟涓細鐢ㄥ埌瀹冿紝鎵浠ヤ竴瀹氳淇濊瘉榪欎釜this鏈夋晥銆傜壒鍒槸紿楀彛鍥炶皟鍑芥暟錛屽鏋滈噴鏀句簡鍙橀噺錛屼絾鏄獥鍙f病鏈夐攢姣佹槸寰堝鏄撳嚭闂鐨勩傜獥鍙e洖璋冨嚱鏁頒篃鏈夋瘮杈冨枩嬈㈢敤涓涓潤鎬佺殑鍒嗛厤鍣紝閫氳繃紿楀彛璇嗗埆錛屾妸浠栧垎閰嶅埌涓嶅悓鐨勬垚鍛樺鐞嗗嚱鏁頒腑鐨勬柟寮忋?/font>
榪欎釜鍙槸鍒濆錛屽師鍥犳槸鍙戠幇ATL鐨勭獥鍙e洖璋冩槸榪欐牱鍋氱殑銆傝寰楀緢紲炲錛屾墍浠ュ涔犱簡涓涓嬶紝鏈変笉瀵圭殑鍦版柟榪樻湜澶氬鎸囨暀銆傚樆鍢匯傘傘?/font>
鎵懼埌鐨勮祫鏂欙細
http://www.vckbase.com/document/viewdoc/?id=1821
http://www.codeproject.com/KB/cpp/GenericThunks.aspx
http://blog.csdn.net/superarhow/archive/2006/07/10/898261.aspx
http://www.cnblogs.com/homeofish/archive/2009/02/20/1395208.html
CComptr<IDispatch> ptrDisp;
IDispatch* pDisp = ptrDisp;瀵規寰堟槸鐤戞儜錛屼負浠涔堜袱涓畬鍏ㄤ笉鍚岀殑綾誨瀷鍙互鏃犲樊鍒殑杞崲銆?br>鐚滄祴1錛?br>璁や負IDispatch閲嶈澆浜嗚祴鍊兼搷浣滅銆?.1縐掔殑鏃墮棿鍚﹀畾銆備粬鍙槸涓涓帴鍙o紝瀹氫箟寰堟槑紜殑4鐨勬柟娉曘備笉鍙兘銆傜敱浜庝笉鐩鎬俊錛岃繕鐗規剰鍘葷湅浜嗕竴涓嬩粬鐨勬帴鍙e畾涔夈傚交搴曟蹇冦?br>鐚滄祴2.
CComptr<IDispatch>閲嶈澆浜嗚祴鍊兼搷浣滅銆備絾鏄兂鏉ユ兂鍘誨簲璇ュ拰浠栫殑閲嶈澆娌℃湁鍏崇郴錛屽洜涓鴻繖涓搷浣滃湪浠栫殑宸﹁竟錛屽拰浠栫殑璧嬪兼搷浣滅鍏ㄧ劧娌℃湁鍏崇郴銆備笉淇′箣錛岃繘鍘葷湅浜嗕竴涓嬶紝騫朵笖鎶婇噸杞界粰娉ㄩ噴鎺夛紝緇撴灉榪樻槸鑳界紪璇戞垚鍔燂紝褰誨簳紜俊涓嶆槸璧嬪肩殑浣滅敤銆?br>
鐪熺浉錛?br>緇堜簬鎷垮嚭鏉鎵嬮攺錛孎11錛屽崟姝ワ紝鍝堝搱錛岃繘鍘誨彂鐜板師鏉ユ湁錛?br>
operator T*() const throw()
{
return p;
}榪欐浠g爜銆傚搱鍝堛傘傞棶浜嗗ぇ鐗涚煡閬撴槸閲嶈澆寮哄埗杞崲銆傚搱鍝堛傜旱嬈茬煡閬撳師鍥犱簡銆傘傘?br>鑷繁涔熸ā浠垮啓浜嗕竴涓嬶細
class A1 

{
public:
int operator*()
{
return 6;
}
operator int() //const
{
return 6;
}
};
int main()

{
int a(5);
int a1 = int(6);
A1 aa1;
int a2 = aa1;
return 0;
}緙栬瘧鎴愬姛錛岀埥銆傘傘傘?br>
鍙槸鐢ㄦ潵鐢ㄥ幓閮戒笉姝g‘銆傜綉涓婂幓鎵劇殑璧勬枡閮芥槸涓涓増鏈殑錛屾垜鏈鍚庣殑浠g爜涓猴細
bool charToUtf_8(IN const char* strSrc, IN OUT char** pstrDst)

{
//u2g(in_utf8,strlen(in_utf8),out,OUTLEN);
iconv_t cd = iconv_open("utf-8", "ANSI_X3.4-1986");
//iconv_t cd = iconv_open("utf-8", "CP_ACP");
if (cd == (iconv_t)(-1))
{
return false;
}
size_t ilen = ::strlen(strSrc) + 1;
size_t olen = ilen * 4;
char *inbuf = new char[ilen];
char *outbuf = new char[olen];
memset(inbuf, 0, ilen);
memset(outbuf, 0, olen);
const char *in = inbuf;
char *out = outbuf;
//
memcpy(inbuf, strSrc, ilen);
size_t ret = iconv(cd, &in, &ilen, &out, &olen);
//涓嬮潰榪欑鏂瑰紡浼氬嚭閿欙紝涓轟粈涔?
//size_t ret = iconv(cd, &inbuf, &ilen, &outbuf, &olen);
// if (ret == (size_t)(-1))
// {
// cerr << "iconv error" << endl;
// }
// else
// {
// cout << outbuf << endl;
// }
delete[] inbuf;
delete outbuf;
iconv_close(cd);
return true;
}
褰撶劧榪欎簺浠g爜鏄粠緗戜笂鎷瘋礉涓嬫潵鍐嶆敼鐨勩傜紪璇戦氳繃錛岃繍琛屽氨涓嶈浜嗐?/p>
鍚庢潵鎴戞斁寮冧簡銆傜洿鎺ョ敤windows鐨勬柟娉曘傦紙榪樺ソ鎴戞槸鍦╳indows涓婂紑鍙戯級
bool CharToUtf_8(IN const char* strSrc, IN OUT char** pstrDst)

{
assert(pstrDst);
int nSize = MultiByteToWideChar(CP_ACP,NULL, strSrc, -1, NULL, 0);
WCHAR* pwchTemp = new WCHAR[nSize];
nSize = MultiByteToWideChar(CP_ACP,NULL, strSrc, -1, pwchTemp, nSize);
nSize = WideCharToMultiByte(CP_UTF8, NULL, pwchTemp, -1, NULL, 0, 0, 0);
*pstrDst = new char[nSize];
nSize = WideCharToMultiByte(CP_UTF8, NULL, pwchTemp, -1, *pstrDst, nSize, 0, 0);
return true;
}
榪欐牱灝卞彲浠ラタ浜嗐傚懙鍛點傘傚搸銆傘傘傘?br>涓嶈繃鎸洪儊闂風殑錛屼負浠涔圛CONV涓嶈兘鐢ㄥ晩錛屾湁楂樻墜鎸囩偣涓涓嬪悧錛?/p>
#include <iostream>
#include<map>
using namespace std;

int main()

{
typedef map<int, int> Map_DInt;
typedef pair<int, int> Map_Pair;
Map_DInt map1;
//empty鏄嫻媘ap鏄惁涓虹┖
if (map1.empty()) //媯嫻嬫槸鍚︿負絀哄鏋滀負絀猴紝杈撳嚭
{
cout << "empty\n";
}
map1[3] = 30; //鍥犱負map閲嶈澆浜哰]鍙互閫氳繃[]鐩存帴娣誨姞鏁版嵁鍜屾煡鎵炬暟鎹?/span>
map1.insert(Map_DInt::value_type(4,40)); //娣誨姞鏁版嵁4(key), 40(value)
map1.insert(Map_Pair(1, 10)); //娣誨姞鏁版嵁1,10
//閬嶅巻鑺傜偣錛屽茍杈撳嚭瀵瑰簲鐨刱ey鍜寁alue
for (Map_DInt::iterator it1 = map1.begin(); it1 != map1.end(); ++it1)
{
cout << "Key:" << it1->first <<" Value:" <<it1->second << endl;
}
//[]涔熷彲浠ョ洿鎺ョ敤浜庢煡鎵撅紝浣嗘槸濡傛灉娌℃湁鎵懼埌錛屼粬浼氶粯璁ゅ姞涓涓艱繘鍘葷殑
Map_DInt::iterator it1;
it1 = map1.find(5); //鏌ユ壘key 涓?鐨勬暟鎹?/span>
if (it1 != map1.end()) //濡傛灉鎵懼埌錛屽垯杈撳嚭浠栫殑鏁版嵁
{
cout << it1->second << endl;
}
else //鍚﹀垯杈撳嚭鎵句笉鍒?/span>
{
cout << "Not Found\n";
}
if (map1[5] != 0)
{
cout << map1[5] << endl;
}
else
{
cout << "Not Found\n";
}
it1 = map1.find(5); //鏌ユ壘key 涓?鐨勬暟鎹?/span>
if (it1 != map1.end()) //濡傛灉鎵懼埌錛屽垯杈撳嚭浠栫殑鏁版嵁
{
cout << it1->second << endl;
}
else //鍚﹀垯杈撳嚭鎵句笉鍒?/span>
{
cout << "Not Found\n";
}
map1[5] = 50; //鏇存敼鐩稿簲鐨勫?/span>
it1 = map1.find(5); //鏌ユ壘key 涓?鐨勬暟鎹?/span>
if (it1 != map1.end()) //濡傛灉鎵懼埌錛屽垯杈撳嚭浠栫殑鏁版嵁
{
cout << it1->second << endl;
}
else //鍚﹀垯杈撳嚭鎵句笉鍒?/span>
{
cout << "Not Found\n";
}
size_t nNum = map1.erase(5); //鍒犻櫎鏁版嵁
map1.clear(); //娓呮鎵鏈夋暟鎹?/span>
system("pause");
return 0;
}

2銆俶ap綆浠?
map鏄竴綾?span style="COLOR: red">鍏寵仈寮忓鍣?/span>銆傚畠鐨勭壒鐐規槸澧炲姞鍜屽垹闄よ妭鐐瑰榪唬鍣ㄧ殑褰卞搷寰堝皬錛岄櫎浜嗛偅涓搷浣滆妭鐐癸紝瀵瑰叾浠栫殑鑺傜偣閮芥病鏈変粈涔堝獎鍝嶃傚浜庤凱浠e櫒鏉ヨ錛屽彲浠ヤ慨鏀瑰疄鍊鹼紝鑰屼笉鑳戒慨鏀筴ey銆?
3銆俶ap鐨勫姛鑳?
4銆備嬌鐢╩ap
浣跨敤map寰楀寘鍚玬ap綾繪墍鍦ㄧ殑澶存枃浠?br>#include <map> //娉ㄦ剰錛孲TL澶存枃浠舵病鏈夋墿灞曞悕.h
map瀵硅薄鏄ā鏉跨被錛岄渶瑕佸叧閿瓧鍜屽瓨鍌ㄥ璞′袱涓ā鏉垮弬鏁幫細
std:map<int, string> personnel;
榪欐牱灝卞畾涔変簡涓涓敤int浣滀負绱㈠紩,騫舵嫢鏈夌浉鍏寵仈鐨勬寚鍚憇tring鐨勬寚閽?
涓轟簡浣跨敤鏂逛究錛屽彲浠ュ妯℃澘綾昏繘琛屼竴涓嬬被鍨嬪畾涔夛紝
typedef map<int, CString> UDT_MAP_INT_CSTRING;
UDT_MAP_INT_CSTRING enumMap;
5銆傚湪map涓彃鍏ュ厓绱?
鏀瑰彉map涓殑鏉$洰闈炲父綆鍗曪紝鍥犱負map綾誨凡緇忓[]鎿嶄綔絎﹁繘琛屼簡閲嶈澆
enumMap[1] = "One";
enumMap[2] = "Two";
.....
榪欐牱闈炲父鐩磋錛屼絾瀛樺湪涓涓ц兘鐨勯棶棰樸?span style="COLOR: #9bbb59">鎻掑叆2鏃?鍏堝湪enumMap涓煡鎵句富閿負2鐨勯」錛屾病鍙戠幇錛岀劧鍚庡皢涓涓柊鐨勫璞℃彃鍏numMap錛岄敭鏄?錛屽兼槸涓涓┖瀛楃涓詫紝鎻掑叆瀹屾垚鍚庯紝灝嗗瓧絎︿覆璧嬩負"Two"; 璇ユ柟娉曚細灝嗘瘡涓奸兘璧嬩負緙虹渷鍊鹼紝鐒跺悗鍐嶈祴涓烘樉紺虹殑鍊鹼紝濡傛灉鍏冪礌鏄被瀵硅薄錛屽垯寮閿姣旇緝澶с傛垜浠彲浠ョ敤浠ヤ笅鏂規硶鏉ラ伩鍏嶅紑閿錛?
enumMap.insert(map<int, CString> :: value_type(2, "Two"))
6銆傛煡鎵懼茍鑾峰彇map涓殑鍏冪礌
涓嬫爣鎿嶄綔絎︾粰鍑轟簡鑾峰緱涓涓肩殑鏈綆鍗曟柟娉曪細
CString tmp = enumMap[2];
浣嗘槸,鍙湁褰搈ap涓湁榪欎釜閿殑瀹炰緥鏃舵墠瀵?/span>錛屽惁鍒欎細鑷姩鎻?span style="COLOR: #548dd4">鍏ヤ竴涓疄渚嬶紝鍊間負鍒濆鍖栧?/span>銆?
鎴戜滑鍙互浣跨敤Find()鍜孋ount()鏂規硶鏉ュ彂鐜頒竴涓敭鏄惁瀛樺湪銆?
鏌ユ壘map涓槸鍚﹀寘鍚煇涓叧閿瓧鏉$洰鐢?span style="COLOR: #f79646">find()鏂規硶錛屼紶鍏ョ殑鍙傛暟鏄鏌ユ壘鐨刱ey錛屽湪榪欓噷闇瑕佹彁鍒扮殑鏄痓egin()鍜宔nd()涓や釜鎴愬憳錛屽垎鍒唬琛╩ap瀵硅薄涓涓涓潯鐩拰鏈鍚庝竴涓潯鐩紝榪欎袱涓暟鎹殑綾誨瀷鏄痠terator.
int nFindKey = 2; //瑕佹煡鎵劇殑Key
//瀹氫箟涓涓潯鐩彉閲?瀹為檯鏄寚閽?
UDT_MAP_INT_CSTRING::iterator it= enumMap.find(nFindKey);
if(it == enumMap.end()) {
//娌℃壘鍒?br>}
else {
//鎵懼埌
}
閫氳繃map瀵硅薄鐨勬柟娉曡幏鍙栫殑iterator鏁版嵁綾誨瀷鏄竴涓猻td::pair瀵硅薄錛屽寘鎷袱涓暟鎹?iterator->first 鍜?iterator->second 鍒嗗埆浠h〃鍏抽敭瀛楀拰瀛樺偍鐨勬暟鎹?
7銆備粠map涓垹闄ゅ厓绱?
縐婚櫎鏌愪釜map涓煇涓潯鐩敤erase()
璇ユ垚鍛樻柟娉曠殑瀹氫箟濡備笅
clear()灝辯浉褰撲簬 enumMap.erase(enumMap.begin(), enumMap.end());
#include <iostream>
#include<set>
using namespace std;

int main()

{
set<int> st1; //鍒涘緩涓涓猧nt綾誨瀷鐨剆et
set<int>::iterator it1; //鍒涘緩涓涓粬瀵瑰簲鐨勮凱浠e櫒
//empty鏄垽鏂粬鏄惁涓虹┖錛岃屼笖濡傛灉瑕佸垽鏂┖錛屾渶濂界敤榪欎釜鏉ュ垽鏂?br>
//濡傛灉涓虹┖榪斿洖true
if (st1.empty()) //鍒ゆ柇絀?濡傛灉鏄┖錛屽垯杈撳嚭empty
{
cout << "empty\n";
}
//鏌ユ壘鏁版嵁錛宖ind銆傝繑鍥炲兼槸鎵懼埌鐨勬儏鍐電殑榪唬鍣紝濡傛灉娌℃湁鎵懼埌錛?br>
//榪唬鍣ㄥ彧鎯砮nd錛屽鏋滄壘鍒幫紝涓烘壘鍒扮殑鏁版嵁錛屾墍浠ヨ繖閲屼竴瀹氳鍏?br>
//鍒ゆ柇涓涓嬫槸鍚︽壘鍒版暟鎹簡銆?/span>
it1 = st1.find(40); //鏌ユ壘鏁版嵁
if (it1 != st1.end()) //濡傛灉鎵懼埌灝辮緭鍑烘暟鎹?/span>
{
cout << *it1 << endl;
}
//鎻掑叆鏁版嵁銆?/span>
st1.insert(10); //鎻掑叆鏁版嵁
st1.insert(30);
st1.insert(20);
st1.insert(40); 
//閬嶅巻鏁版嵁錛岀敤榪唬鍣ㄩ亶鍘嗘暟鎹?/span>
for (it1 = st1.begin(); it1 != st1.end(); ++it1) 
{
cout << *it1 << endl;
}
//鍥犱負寮濮嬫病鏈?0榪欎釜鍏冪礌錛屾墍浠ユ壘涓嶅埌錛岀幇鍦ㄦ彃鍏ヤ簡錛屽啀
//瀵繪壘涓涓嬨傚懙鍛碉紝鎵懼埌浜嗐?/span>
it1 = st1.find(40); //鏌ユ壘鏁版嵁
if (it1 != st1.end()) //濡傛灉鎵懼埌灝辮緭鍑烘暟鎹?/span>
{
cout << *it1 << endl;
}
//鍒犻櫎鏁版嵁榪欓噷榪斿洖鐨勬槸鍒犻櫎鐨勪釜鏁般傚湪榪欓噷褰撶劧鏄?鍜?/span>
size_t kk = st1.erase(40);
cout << kk << endl;
//娓呴櫎鍏ㄩ儴鏁版嵁銆?/span>
st1.clear();
system("pause");
return 0;
}

| Operator | Description | Example | Overloadable |
|---|---|---|---|
| Group 1 (no associativity) | |||
| :: | Scope resolution operator | Class::age = 2; | NO |
| Group 2 | |||
| () | Function call | isdigit('1') | YES |
| () | Member initalization | c_tor(int x, int y) : _x(x), _y(y*10){}; | YES |
| [] | Array access | array[4] = 2; | YES |
| -> | Member access from a pointer | ptr->age = 34; | YES |
| . | Member access from an object | obj.age = 34; | NO |
| ++ | Post-increment | for( int i = 0; i < 10; i++ ) cout << i; | YES |
| -- | Post-decrement | for( int i = 10; i > 0; i-- ) cout << i; | YES |
| const_cast | Special cast | const_cast<type_to>(type_from); | NO |
| dynamic_cast | Special cast | dynamic_cast<type_to>(type_from); | NO |
| static_cast | Special cast | static_cast<type_to>(type_from); | NO |
| reinterpret_cast | Special cast | reinterpret_cast<type_to>(type_from); | NO |
| typeid | Runtime type information | cout « typeid(var).name(); cout « typeid(type).name(); |
NO |
| Group 3 (right-to-left associativity) | |||
| ! | Logical negation | if( !done ) … | YES |
| not | Alternate spelling for ! | ||
| ~ | Bitwise complement | flags = ~flags; | YES |
| compl | Alternate spelling for ~ | ||
| ++ | Pre-increment | for( i = 0; i < 10; ++i ) cout << i; | YES |
| -- | Pre-decrement | for( i = 10; i > 0; --i ) cout << i; | YES |
| - | Unary minus | int i = -1; | YES |
| + | Unary plus | int i = +1; | YES |
| * | Dereference | int data = *intPtr; | YES |
| & | Address of | int *intPtr = &data; | YES |
| new | Dynamic memory allocation | long *pVar = new long; MyClass *ptr = new MyClass(args); |
YES |
| new [] | Dynamic memory allocation of array | long *array = new long[n]; | YES |
| delete | Deallocating the memory | delete pVar; | YES |
| delete [] | Deallocating the memory of array | delete [] array; | YES |
| (type) | Cast to a given type | int i = (int) floatNum; | YES |
| sizeof | Return size of an object or type | int size = sizeof floatNum; int size = sizeof(float); |
NO |
| Group 4 | |||
| ->* | Member pointer selector | ptr->*var = 24; | YES |
| .* | Member object selector | obj.*var = 24; | NO |
| Group 5 | |||
| * | Multiplication | int i = 2 * 4; | YES |
| / | Division | float f = 10.0 / 3.0; | YES |
| % | Modulus | int rem = 4 % 3; | YES |
| Group 6 | |||
| + | Addition | int i = 2 + 3; | YES |
| - | Subtraction | int i = 5 - 1; | YES |
| Group 7 | |||
| << | Bitwise shift left | int flags = 33 << 1; | YES |
| >> | Bitwise shift right | int flags = 33 >> 1; | YES |
| Group 8 | |||
| < | Comparison less-than | if( i < 42 ) … | YES |
| <= | Comparison less-than-or-equal-to | if( i <= 42 ) ... | YES |
| > | Comparison greater-than | if( i > 42 ) … | YES |
| >= | Comparison greater-than-or-equal-to | if( i >= 42 ) ... | YES |
| Group 9 | |||
| == | Comparison equal-to | if( i == 42 ) ... | YES |
| eq | Alternate spelling for == | ||
| != | Comparison not-equal-to | if( i != 42 ) … | YES |
| not_eq | Alternate spelling for != | ||
| Group 10 | |||
| & | Bitwise AND | flags = flags & 42; | YES |
| bitand | Alternate spelling for & | ||
| Group 11 | |||
| ^ | Bitwise exclusive OR (XOR) | flags = flags ^ 42; | YES |
| xor | Alternate spelling for ^ | ||
| Group 12 | |||
| | | Bitwise inclusive (normal) OR | flags = flags | 42; | YES |
| bitor | Alternate spelling for | | ||
| Group 13 | |||
| && | Logical AND | if( conditionA && conditionB ) … | YES |
| and | Alternate spelling for && | ||
| Group 14 | |||
| || | Logical OR | if( conditionA || conditionB ) ... | YES |
| or | Alternate spelling for || | ||
| Group 15 (right-to-left associativity) | |||
| ? : | Ternary conditional (if-then-else) | int i = (a > b) ? a : b; | NO |
| Group 16 (right-to-left associativity) | |||
| = | Assignment operator | int a = b; | YES |
| += | Increment and assign | a += 3; | YES |
| -= | Decrement and assign | b -= 4; | YES |
| *= | Multiply and assign | a *= 5; | YES |
| /= | Divide and assign | a /= 2; | YES |
| %= | Modulo and assign | a %= 3; | YES |
| &= | Bitwise AND and assign | flags &= new_flags; | YES |
| and_eq | Alternate spelling for &= | ||
| ^= | Bitwise exclusive or (XOR) and assign | flags ^= new_flags; | YES |
| xor_eq | Alternate spelling for ^= | ||
| |= | Bitwise normal OR and assign | flags |= new_flags; | YES |
| or_eq | Alternate spelling for |= | ||
| <<= | Bitwise shift left and assign | flags <<= 2; | YES |
| >>= | Bitwise shift right and assign | flags >>= 2; | YES |
| Group 17 | |||
| throw | throw exception | throw EClass(“Message”); | NO |
| Group 18 | |||
| , | Sequential evaluation operator | for( i = 0, j = 0; i < 10; i++, j++ ) … | YES |