-------------------------查找代碼和相關主題php
http://www.oschina.net/code/snippet_12_1001html
1:指針引用區別。
2:將構造函數或者析構函數聲明爲protect會阻止該類被使用非new或者delete的方式調用。構造函數省名public,析構函數聲明private,便可防止
外部使用delete的方式刪除對象。若是使用private會組織該類被繼承。
3:const_cast:去掉const屬性:
const int uu=10;
const int &cu=uu;
int *pax= const_cast<int*>(&cu);
4:dynamic_cast:繼承關係的上下轉換,基類必須含有虛函數。
a * p= dynamic_cast<a*>(pa);
base * pbase=dynamic_cast<base*>(pp);
5:不能對數組傳遞多態類型。由於數組是順序訪問的i*size(obj),而此obj是父類的大小不是子類的大小。這樣就可能轉換出界。
6:函數數組參數是傳址,若是須要固定數組長度限制可以使用數組引用:
void ff2(int arr[]){}//數據傳址
void ff2(int (&arr)[10]){}//數據引用
7:使父類的析構函數成爲虛函數,能夠在delete父類指針的時候一併調用子類的析構函數(父類指針指向的是子類對象):
a * p1= new a();
base *p2=p1;
delete p2;//會調用~a(),而後調用~base(); 若是析構函數不是虛函數,則是調用~a(),這樣的話會有內存泄露;
8:stl的remove_if算法只能用於非關聯容器,且不會真正刪除關聯容器的數據,只會作一個分界,將不知足if的放在界限的前面,
知足if的放到界限的後頭。因此要刪除最好使用erase+remove_if
class Fun
{
public:
bool operator () (const int & v){return (v%5)==0;}
//Functor的對象就是函數符
};
void main()
{
vector<int> arr;
for (int i=0;i<10;i++)
arr.push_back(i);
vector<int>::iterator ss =remove_if(arr.begin(), arr.end(), Fun());
arr.erase(ss,arr.end());
}
9:stl仿函數的適配器(即綁定)分爲兩種bind2nd和bind1st。通常使用bind2nd多一點:
class Fun2: std::binary_function<string, char *, bool>
{
bool operator() (string & a, char* b) const
{
if (!a.compare(b))
return true;
else
return false;
}
};
bind2nd(Fun2,val):意思是將仿函數Fun和變量val綁定在一塊兒。若是val值發生變化,與之相關綁定的仿函數的第二個參數(也就上面是重載
operator()的參數char* b)的值也會發生改變。
bind1st(Fun2,val):意思是將仿函數Fun和變量val綁定在一塊兒。若是val值發生變化,與之相關綁定的仿函數的第一個參數(也就上面是重載
operator()的參數char* a)的值也會發生改變。
10:stl迭代器適配器:
流適配器:istream_iterater,ostream_iterater,istreambuf_iterater,ostreambuf_iterater
插入適配器:back_insert_iterator,front_insert_iterator,insert_iterator
順序容器適配器:stack,queue
11:stl的unique算法能夠查找相鄰重複(能夠是>=2個,但都需相鄰)元素,unique實質上沒有刪掉重複數據,
順序容器的長度不變,跟remove的算法是同樣的,只會作一個分界,
把相鄰重複元素以外的其餘元素複製到一個較小的區間中,並返回指向該區間末尾的迭代器:
vector<int> v;
v.push_back(2);
v.push_back(6);
v.push_back(6);
v.push_back(6);
v.push_back(9);
v.push_back(4);
v.push_back(4);
v.push_back(6);
v.push_back(3);
v.push_back(3);
v;//(2,6,6,6,9,4,4,6,3,3)
vector<int>::iterator result, xx;
result=unique(v.begin(),v.end());
v;//(2,6,9,4,6,3,4,6,3,3)
cout<<*(--v.end())<<endl;//3
此刻:(result)到(--v.end())就是那重複的數據,即4,6,3
12:stl的adjacent_find算法是產找一堆相鄰的重複元素,並只返回第一次查找到的迭代器:
vector<int> v;
v.push_back(2);
v.push_back(6);
v.push_back(6);
v.push_back(6);
v.push_back(9);
v.push_back(4);
v.push_back(4);
vector<int>::iterator result;
result= adjacent_find(v.begin(),v.end());//6
13:stl的copy算法:
vector<string> vv,vv2,vv3;
vv.push_back("aaa");
vv.push_back("bbb");
ifstream f("d:\\1.txt");
ofstream f2("d:\\2.txt",ios::app);
copy(istream_iterator<string>(f),istream_iterator<string>(),back_inserter(vv2));//將流拷貝到vect中
copy(vv.begin(),vv.end(),ostream_iterator<string>(f2));//將vect寫入流中
//copy(vv.begin(),vv.end(),vv3.begin());//error
copy(vv.begin(),vv.end(),back_inserter(vv3));//succ
14:merge和set_union的都是合併容器。兩個容器必須先都得有序,不然會報錯。區別是但前者不排重,後者排重:
vector<string> vec1, vec2, vec3,vec;
vec1.push_back("aa");
vec1.push_back("bb");
vec1.push_back("cc");
vec2.push_back("ff");
vec2.push_back("bb");
vec2.push_back("ff");
sort(vec1.begin(),vec1.end());
sort(vec2.begin(),vec2.end());
set_union(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),back_inserter(vec3));//("aa","bb","cc","ff","ff")
merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), back_inserter(vec));//("aa","bb","bb","cc","ff","ff")
unique_copy(vec.begin(),vec.end(),back_inserter(vec4));//vec4==>("aa","bb","cc","ff")
vector<string>::iterator iter= unique(vec.begin(),vec.end());//("aa","bb","cc","ff","ff","ff")
vec.erase(iter,vec.end());//("aa","bb","cc","ff")
15:unique_copy和unique相似只是會將不連續重複的數據放到另外一個容器中。參見14。
16:partial_sort獲取前多少名的排序方法,獲取全部數據中最大/小的前n名:
bool fun4(string s1,string s2)
{
return atoi(s1.c_str())<atoi(s2.c_str());
}
class Fun5
{
public:
bool operator () (const string & v1,const string & v2)
{
return atoi(v1.c_str())<atoi(v2.c_str());
}
};
vector<string> vec;
vec.push_back("11");
vec.push_back("16");
vec.push_back("88");
vec.push_back("13");
vec.push_back("9");
partial_sort(vec.begin(),vec.begin()+3,vec.end(),fun4);//("9","11","13","88","16")只排序top n,好比獲取全班前3名最高分數的學生成績
partial_sort(vec.begin(),vec.begin()+3,vec.end(),Fun5());//("9","11","13","88","16")只排序top n,好比獲取全班前3名最高分數的學生成
績。
17:nth_element算法是獲取第n個數據,好比班上有10個學生,我想知道分數排在倒數第4名的學生:
vector<int> vect;
vect.push_back(133);
vect.push_back(1);
vect.push_back(23);
vect.push_back(9);
vect.push_back(13);
nth_element(vect.begin(), vect.begin()+3, vect.end(),less<int>());
vect[3];//即到時第4那個學生的分數
18:rotate算法是將容器一部分區間段放置到容器的尾端:
vector<int> vec;
vec.push_back(74);
vec.push_back(56);
vec.push_back(92);
vec.push_back(85);
vec.push_back(56);
rotate(vec.begin(),vec.begin()+3,vec.end());//(85,56,74,56,92)
19:equal算法是判斷兩個容器是否相等,但首先得保證兩個容器長度同樣,排好序,不然沒意義,且報錯:
vector<int> vec,vec2;
vec.push_back(74);
vec.push_back(56);
vec.push_back(92);
vec.push_back(85);
vec.push_back(85);
vec2.push_back(92);
vec2.push_back(156);
vec2.push_back(1526);
//bool a= equal(vec.begin(),vec.end(),vec2.begin());//error
bool a= equal(vec2.begin(),vec2.end(),vec.begin());//error
20:find_if算法,找到知足條件的第一個:
bool fun6(int ii)
{
return ii==3;
}
class Fun5 : public binary_function<int, int, bool>
{
public:
bool operator () (const int & v1,const int & v2) const
{
return v1==v2;
}
//Functor的對象就是函數符
};
vector<int> vec,vec2;
vector<int>::iterator iter;
vec.push_back(74);
vec.push_back(56);
vec.push_back(92);
vec.push_back(85);
vec.push_back(85);
vec2.push_back(92);
vec2.push_back(156);
vec2.push_back(1526);
iter= find(vec.begin(),vec.end(),85);
int g=92;
iter= find_if(vec.begin(),vec.end(),fun6);
iter= find_if(vec.begin(),vec.end(),bind2nd(Fun5(),g));
21:find_end算法是在一個區間中查找等於(須要連續相等)另外一個區間全部元素,而後取出最後一個連續相等的最後一次的手元素的迭代器,
find_first_of跟find_end返回的結果恰好相反:
vector<int> vec,vec2;
vector<int>::iterator iter;
vec.push_back(74);
vec.push_back(56);
vec.push_back(92);
vec.push_back(156);
vec.push_back(85);
vec.push_back(92);
vec.push_back(156);
vec.push_back(9911);
vec2.push_back(92);
vec2.push_back(156);
vec2.push_back(1526);
iter= find_end(vec.begin(),vec.end(),vec2.begin(),vec2.begin()+2);//92
iter=iter+2;//9911
iter= find_first_of(vec.begin(),vec.end(),vec2.begin(),vec2.begin()+2);//92
iter=iter+2;//85
22:equal_range=lower_bound+upper_bound,獲取某個數據可插入的先後位置,且此位置在插入後不影響容器的大小排序:
vector<int> vec,vec2;
vector<int>::iterator iter;
vec.push_back(74);
vec.push_back(56);
vec.push_back(92);
vec.push_back(156);
vec.push_back(85);
vec.push_back(92);
vec.push_back(156);
vec.push_back(9911);
sort(vec.begin(),vec.end());
iter= lower_bound(vec.begin(),vec.end(),92);//92
iter= upper_bound(vec.begin(),vec.end(),92);//156
pair<vector<int>::iterator,vector<int>::iterator> pa= equal_range(vec.begin(),vec.end(),92);//<92,156>
23:next_permutation,prev_permutation算法分別是後去下一個和上一個全排列的組合,最好先sort排次序,再用。好比(a,b,c)的全排列爲
{a, b, c}、{a, c, b}、{b, a, c}、{b, c, a}、{c, a, b}、{c, b, a}而(a,c,b)的上一個全排序就爲(a, b, c),
(a,c,b)的下一個全排序就爲(b, a, c):
vector<string> vec,vec2;
vector<string>::iterator iter;
vec.push_back("c");
vec.push_back("a");
vec.push_back("b");
sort(vec.begin(),vec.end());
while (next_permutation(vec.begin(),vec.end()))
cout<<vec<<endl;
24:search,search_n算法是分別指返回某個數據連續出現1次和連續出現n次的第一次出現迭代器:
vector<string> vec,vec2;
vector<string>::iterator iter;
vec.push_back("c");
vec.push_back(",");
vec.push_back("a");
vec.push_back(",");
vec.push_back(",");
vec.push_back("b");
iter= search_n(vec.begin(),vec.end(),2,",");//,
iter=(iter+1);//,
iter=(iter+1);//b
25:includes算法是指一個區間是否包含另外一個區間的值,前提是這兩個區間須要有序:
vector<string> vec,vec2;
vector<string>::iterator iter;
vec.push_back("c");
vec.push_back(",");
vec.push_back("a");
vec.push_back(",");
vec.push_back(",");
vec.push_back("b");
vec2.push_back("a");
vec2.push_back("c");
sort(vec.begin(),vec.end());
sort(vec2.begin(),vec2.end());
bool bol= includes(vec.begin(),vec.end(),vec2.begin(),vec2.end());//true
26:accumulate「求和」算法ios
accumulate(A.begin(),A.end(),10); //能夠理解爲10+A[1]+A[2]+…c++
accumulate(A.begin(),A.end(),10,minus<int>()); //能夠理解爲10-A[1]-A[2]-…算法
int myfunction (int x, int y)
{
int z= x+2*y;
return z;
}shell
int init = 100;
int numbers[] = {10,20,30};
數據庫
int c=std::accumulate (numbers, numbers+3, init, myfunction);//能夠理解爲myfunction(myfunction(100, numbers[0]), numbers[1])......
api
27:set_intersection求交集數組
vector<string> intersect(vector<string>vec1, vector<string> vec2)
{
vector<string> vec;
sort(vec1.begin(), vec1.end());
sort(vec2.begin(), vec2.end());
set_intersection(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), back_inserter(vec));
return vec;
}
app
------------------volatile 關鍵字的使用(搞嵌入式的行業會常常遇到這個關鍵字)
http://blog.csdn.net/wwang196988/article/details/6623387
1:cpu寄存器放一個從內存拷貝的版本,內存一個版本,共兩個版本,若是兩個線程同時使用此變量的時候難保證會使用的都是cpu寄存器版本的變量或者是內存的那個版本的變量。
2:編譯器可能會優化訪問此volatile變量的代碼,便可能從寄存器中獲取,或者從內存中獲取此volatile變量,若是沒加volatile關鍵字的話這是由編譯器決定的,若是加了volatile關鍵字則每次都會從內存中獲取此變量。
----------------可變參數:
http://bbs.chinaunix.net/thread-4058976-1-1.html
http://blog.csdn.net/llg521208/article/details/6128744
string sprintfs(const char * fmt, ...){
char szBuffer[1024]={0};
va_list ap;
va_start(ap, fmt);
vsnprintf_s(szBuffer, 1024, fmt, ap);
va_end(ap);
return string(szBuffer);
}
-------------------stl 仿函數適配器 (即綁定)bind2nd和bind1st綁定
http://larrytang.iteye.com/blog/850260
http://blog.csdn.net/xuqing1980/article/details/1269424
http://blog.csdn.net/simahao/article/details/405455
http://blog.csdn.net/garfier/article/details/8062141
-----------------remove_if的用法:
http://blog.sina.com.cn/s/blog_68c02fb90100xhoi.html
-----------------stl迭代器:
http://www.cnblogs.com/L-hq815/archive/2012/08/28/2660714.html
http://blog.csdn.net/fall221/article/details/8233606
http://blog.csdn.net/fdl19881/article/details/6685744------istream_iterater的使用
http://blog.csdn.net/bichenggui/article/details/4710996 ---------可使用istreambuf_iterater讀取字符,而istream_iterater不行,由於會忽略空格。
http://www.cnblogs.com/HappyAngel/archive/2011/05/03/2035636.html
http://zhidao.baidu.com/link?url=0epEJwCKfpmtuomAfpbh433WC-XCQn5yedicQmXgecb0eOxsKr3iyKDUShx20lvp4236Zgsaw3IFG5_QFEF8Ha ----容器適配器
----------------stl算法
http://www.cplusplus.com/reference/algorithm/equal/?kw=equal ------------算法查找demo
http://www.cppblog.com/mzty/archive/2005/12/15/1770.html ----------排序算法
http://wenku.baidu.com/view/f1855128cfc789eb172dc88d.html
http://www.cnblogs.com/yuehui/archive/2012/06/19/2554300.html
------------------------------stl缺乏正則:
可使用pcre來進行正則使用:
C++中使用Regex一直是個麻煩事,爲了小小的Regex安裝boost庫實在不是什麼能讓人感受到興奮的事情。http://iregex.org/的老大推薦了http://www.pcre.org/,感受很是很是的不錯。有興趣的朋友絕對值得去研究一下。 Win下的版本能夠從http://www.psyon.org/projects/pcre-win32/index.php, 或http://gnuwin32.sourceforge.net/packages/pcre.htm獲取。
下載pcre-----http://dearymz.blog.163.com/blog/static/20565742008724104826358/
安裝pcre---------cmd==>cd 下載的文件夾中==>nmake -f makefile
示例----------------http://www.wuzesheng.com/?p=994 http://www.oschina.net/code/snippet_203297_7559
---------------------------在window下給某個窗體發送wm_command命令
HWND pHwnd= FindWindow(NULL, sDataCheckPlatformName.c_str());//"數據檢查平臺 5.0.0.0 版" ::SendMessage( pHwnd, WM_COMMAND, IDM_ANNDM_EXE, NULL);
-------獲取當前時間
string GetNowTime() { struct tm *newtime; char tmpbuf[128]; time_t lt1; time( <1 ); newtime=localtime(<1); strftime( tmpbuf, 128, "%m-%d,%H:%M:%S", newtime); return tmpbuf; }
---------------------字符串split切割
std::vector<std::string> split(std::string str,std::string pattern) { std::string::size_type pos; std::vector<std::string> result; str+=pattern;//擴展字符串以方便操做 int size=str.size(); for(int i=0; i<size; i++) { pos=str.find(pattern,i); if(pos<size) { std::string s=str.substr(i,pos-i); result.push_back(s); i=pos+pattern.size()-1; } } return result; }
------------------字符串trim
inline static string& left(string& str) { string::size_type index = str.find_first_not_of(" \n\r\t,"); if (index != string::npos){str = str.substr(index);} return str; } inline static string& right(string& str) { string::size_type index = str.find_last_not_of(" \n\r\t,"); if (index != string::npos){str = str.substr(0, index + 1);} return str; } inline static string& trim(string& str) { return left(right(str)); }
---------------------------------相似shell命令,執行exe
long ShellExe(const string& strcmdline, string sDataCheckPlatformLogPath, string sDataCheckPlatformName) { PROCESS_INFORMATION piprocinfo; STARTUPINFO sistartinfo; memset(&sistartinfo, 0, sizeof(sistartinfo)); // Set up memory block,這個很重要 // set up members of startupinfo structure. sistartinfo.cb = sizeof(STARTUPINFO); sistartinfo.lpReserved = NULL; sistartinfo.lpReserved2 = NULL; sistartinfo.cbReserved2 = 0; sistartinfo.lpDesktop = NULL; sistartinfo.dwFlags = 0; char strcmd[1000]={0}; strcpy(strcmd, strcmdline.c_str()); CreateProcess ( NULL, strcmd, NULL, // process security attributes NULL, // primary thread security attributes 0, // handles are inherited 0, // creation flags NULL, // use parent\'s environment NULL, // use parent\'s current directory &sistartinfo, // startupinfo pointer &piprocinfo); // receives process_information Sleep(5000);//爲了啓動界面 LARGE_INTEGER BegainTime ; LARGE_INTEGER EndTime ; LARGE_INTEGER Frequency ; QueryPerformanceFrequency(&Frequency); QueryPerformanceCounter(&BegainTime); //功能性代碼放在這裏 begin---------------------------------------------------- HWND pHwnd= FindWindow(NULL, sDataCheckPlatformName.c_str());//"數據檢查平臺 5.0.0.0 版" ::SendMessage( pHwnd, WM_COMMAND, IDM_ANNDM_EXE, NULL); //功能性代碼放在這裏 end ---------------------------------------------------- long lWaitTime=500;//每隔0.5s檢測一次 string sStartProcessTime= GetNowTime(); do { WaitForSingleObject(piprocinfo.hProcess, lWaitTime); } while (!IsProcessOver(sDataCheckPlatformLogPath, sStartProcessTime));//數據檢查平臺運行日誌 QueryPerformanceCounter(&EndTime) ; long lCostTime=( EndTime.QuadPart - BegainTime.QuadPart )*1000 / Frequency.QuadPart ; TerminateProcess(piprocinfo.hProcess, 0); return lCostTime; }
--------------------------處理xml的時候可使用tinyxml
http://qaohao.iteye.com/blog/496237
--------------------------安裝vs2010的時候編譯的時候可能會碰到 "LNK1123: 轉換到 COFF 期間失敗: 文件無效或損壞" 錯誤
解決方案:http://blog.chinaunix.net/uid-20385936-id-3506149.html
下載cvtres.exe而後覆蓋「C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe」(若是vs2010安裝的c盤的話)
----------------------------磁盤操做
vector<string> GetLogicalDriveStrings() //獲取全部磁盤 { vector<string> vectDrive; DWORD dwDiskCount= 0; DWORD dwBitMask = GetLogicalDrives(); for (DWORD dw = 0 ;dw<26;dw++) { if (dwBitMask&1) { dwDiskCount++; } dwBitMask=dwBitMask>>1; } printf("Logical Disk Count %d\n",dwDiskCount); DWORD dwDriveStrLen = 0; dwDriveStrLen= GetLogicalDriveStrings(0,NULL); TCHAR *szDriveName = new char[dwDriveStrLen]; TCHAR *pDriveName=NULL; if (GetLogicalDriveStrings(dwDriveStrLen,szDriveName)) { pDriveName = szDriveName; while (*pDriveName!=NULL) { printf("%s\n",pDriveName); long lDriveType =GetDriveType(pDriveName); switch (lDriveType) { case DRIVE_UNKNOWN : break; case DRIVE_NO_ROOT_DIR: break; case DRIVE_REMOVABLE : break; case DRIVE_FIXED : vectDrive.push_back(pDriveName); break; case DRIVE_REMOTE: break; case DRIVE_CDROM: break; case DRIVE_RAMDISK: break; default: break; } pDriveName+=lstrlen(pDriveName)+1; } } else { printf("GetLogicalDriveStrings Failed,%d",GetLastError()); } return vectDrive; } long GetFreeG(string sDirectoryName) //獲取磁盤空間大小 { long lG= 0; ULARGE_INTEGER nFreeBytesAvailable; ULARGE_INTEGER nTotalNumberOfBytes; ULARGE_INTEGER nTotalNumberOfFreeBytes; if (GetDiskFreeSpaceEx(sDirectoryName.c_str(), &nFreeBytesAvailable, &nTotalNumberOfBytes, &nTotalNumberOfFreeBytes)) { lG= nTotalNumberOfFreeBytes.QuadPart/1024/1024/1024; } return lG; }
---------------------------講一個數組平均分配成M份
double array_sum(string *arr, int length) { double sum = 0; for (long i=0; i<length; i++) { string sline= arr[i]; vector<string> vectkv= split(sline, ","); sum += atof(vectkv[1].c_str()); } return sum; } //將vectSrc平均分配成m組 map<long, vector<string> > AvgAlloc(vector<string> vectSrc, long m) { map<long, vector<string> > mapassign; vector<string> vectEnable; string ** pgroup= NULL; long n= vectSrc.size(); pgroup= new string* [m]; for (long i=0;i<m;i++) pgroup[i]= new string[n]; for (long i=0;i<m;i++) for (long j=0;j<n;j++) pgroup[i][j]= ZERO; int *g =new int[m]; for (long i=0;i<m;i++) g[i]= 0; //升序 sort(vectSrc.begin(), vectSrc.end(), cmp); long x=0, y=0; for (long i=n-1;i>=0;i--) { long k=0; double dminM= MAXLONG; for (long j=0;j<m;j++) { if (dminM > array_sum(pgroup[j], n)) { dminM = array_sum(pgroup[j], n); /* 找出最小的 */ k = j; /* 記住是哪一組 */ } } pgroup[k][g[k]] = vectSrc[i]; g[k]= g[k]+1; } for (long i=0;i<m;i++) { vector<string> vectline; for (long j=0;j<n;j++) { string sline= pgroup[i][j]; if (sline==ZERO) continue; vectline.push_back(sline); } if (vectline.size()>0) mapassign[i]= vectline; } for (long i=0;i<m;i++) delete[] pgroup[i]; delete[] pgroup; delete[] g; return mapassign; } //test 將vectstats的字符串用逗號隔開的後面那個double做爲對比值 vector<string> vectstats; vectstats.push_back("24523542,75.6"); vectstats.push_back("23223542,15.6"); vectstats.push_back("33523542,125.3"); vectstats.push_back("84523542,5.3"); vectstats.push_back("94523542,35.3"); vectstats.push_back("74523542,56.9"); map<long, vector<string> > mapgroup= AvgAlloc(vectstats, vectmachine.size());
----------------------在使用MFC的CString的時候不能以下使用,使用次數多了就會報錯。
CString sErr;
sErr.Format("{%s}%s", sRoadLine, sErr);//會引發錯誤,崩潰。
stl::string ss="asdfsd";
sErr.Format("{%s}%s", sRoadLine, ss);//會引發錯誤,崩潰。須要將ss==>ss.c_str()
---------------------指針的注意:
#define DELETE_PTR(ptr) if(NULL!=ptr){delete(ptr);ptr=NULL;} CNode *pWFTNode= NULL;//不用釋放 CNode *pFNode= pRoad->GetFNodeEx(); pWFTNode=pFNode; DELETE_PTR(pFNode); DELETE_PTR(pWFTNode);//崩潰
--------------------
CMD可使用CreateProcess的方式來調用。
CreateProcess的第二個參數須要寫成這樣便可:「cmd.exe /c rd /s /q d:\aa」
/c 會自動退出, /k 則不會
----------------字符串替換函數
void string_replace(std::string& strBig, const std::string & strsrc, const std::string &strdst) { std::string::size_type pos = 0; while( (pos = strBig.find(strsrc, pos)) != string::npos) { strBig.replace(pos, strsrc.length(), strdst); pos += strdst.length(); } }
----------獲得路徑的上N級目錄
string getuplevel(string spath, long llevel) { string senable; vector<string> vectpart= split(spath, "\\"); long lsize= vectpart.size(); for (long i=0;i<lsize-llevel;i++) { senable= senable+ vectpart[i]+ "\\"; } return trim(senable); }
---------------------------異常捕獲
對於C++的結構化異常 通常的try catch很難捕獲,可使用第三方的一個庫"dbghelp"
固然,這一切都依賴於VC產生的程序數據庫文件(pdb),以及提供以上API函數的dbghelp.dll。 |
http://download.csdn.net/download/ydsoft/4140786(dbghelp下載地址和使用方式)
在VC6中使用dbghelp的時候可能會報錯"error C2146: syntax error : missing ';' before identifier 'ReqOffsets'",解決辦法是在調用dbghelp.h文件的文件中加入一句:
typedef unsigned long ULONG_PTR, *PULONG_PTR;
http://blog.csdn.net/mergerly/article/details/6288358(dbghelp使用方式)
http://blog.csdn.net/vblittleboy/article/details/6561868(解決Cannot use __try in functions that require object unwinding)
http://m.blog.csdn.net/blog/hlfkyo/6645369
http://www.debugease.com/vc/863098.html(對於vector的下標越界問題,vc6的stl庫沒有捕獲而是交給了調用方,而vs2008以上版本的stl捕獲了,不會再拋出給調用方。因此再vs2008中使用dbghelp的話仍是捕獲不到vector的數組越界異常。)
vs2010中嘗試過,vs2010是能夠的。
-----------------release模式下調試程序,能夠以下設置:
---------------------PathFileExists的使用須要加入以下內容纔可。
#include "Shlwapi.h"
#pragma comment(lib,"Shlwapi.lib")
---------------------獲取文件夾大小:http://www.cppblog.com/humanchao/archive/2012/09/28/55154.html
----------數據對齊
對於C++中的結構體對齊能夠按照如下規則進行計算:
http://www.cnblogs.com/graphics/archive/2010/08/12/1797953.html
// rarf.cpp : Defines the entry point for the console application. // #include "stdafx.h" struct Node_X { short a;//2 int c;//4 double b;//8 char d;//1 };//24 struct Node { double b;//8 short a;//2 int c;//4 char d;//1 };//24 struct Node2 { char a;//1 int b;//4 double c;//8 Node d;//24 };//40 struct Node3 { int b;//4 Node2 a;//40 };//48 struct Node4 { Node2 a;//40 int b;//4 };//48 struct C { char a;//1 int b;//4 short c;//2 };//12 struct D { char b;//1 };//1 //對sizeof(E)=對sizeof(C)+size(D)求int(4字節)的倍數(此處的8字節是由於結構體C和D中最大的類型是int) struct E { C c1;//12 D d1;//1 };//16 int _tmain(int argc, _TCHAR* argv[]) { int xx_x= sizeof(Node_X);//24 int xx= sizeof(Node);//24 int xx2= sizeof(Node2);//40 int xx3= sizeof(Node3);//48 int xx4= sizeof(Node4);//48 int xx5= sizeof(C);//12 int xx6= sizeof(D);//1 int xx7= sizeof(E);//16 return 0; }
------------------左右移
左移一位至關於乘以2。
右移一位至關於除以2。
cout<<(4<<1)<<endl;//4*2 cout<<(4>>1)<<endl;//4/2
----------------沒法定位程序輸入點 _except_handler4_common 於動態連接庫 msvcrt.dll上。
刪除exe統計目錄下全部以「ms」開頭的dll,只留下msvcp100.dll和msvcr100.dll便可。
---------半角轉全角
int CnvAnsToGbk(CString &strTmp) { const CString strNew = strTmp; strTmp = ""; unsigned char c1;//第1字節 unsigned char c2;//第2字節 int nLength = strNew.GetLength(); for(int i = 0; i < nLength; NULL) { c1 = strNew[i]; if (i+1 < nLength) { c2 = strNew[i+1]; } else { c2 = 0; } if(c1 < 0x80)//半角字符 { if (c1 == ' ') { strTmp += 0xA1; strTmp += 0xA1; } else { strTmp += 0xA3; strTmp += c1 + 0x80; } i += 1; continue; } //全角字符 strTmp += c1; strTmp += c2; i += 2; } return strTmp.GetLength(); }
---------全角轉半角
int CnvGbkToAns(CString &strTmp, BOOL bKeepGBK) { const CString strNew = strTmp; strTmp = ""; unsigned char c1;//第1字節 unsigned char c2;//第2字節 int nLength = strNew.GetLength(); for(int i = 0; i < nLength; NULL) { c1 = strNew[i]; if (i+1 < nLength) { c2 = strNew[i+1]; } else { c2 = 0; } if (c1 == 0xA3) //判斷是否爲數字、字母或符號 { strTmp += c2-0x80; i += 2; continue; } else if (c1 == 0xA1) //判斷是否爲空格 { if (c2 == 0xA1) { strTmp += ' '; } else if(bKeepGBK) { strTmp += c1; strTmp += c2; } i += 2; continue; } else if(c1 > 0x80)//其它全角字符 { if (bKeepGBK) { strTmp += c1; strTmp += c2; } i += 2; continue; } //半角字符 strTmp += c1; i += 1; } return strTmp.GetLength(); }
---------c++寫入,修改ini配置文件
GetPrivateProfileString:獲得ini下某個group下的一個key-value GetPrivateProfileSection:獲得ini下group下的所有key-values WritePrivateProfileString:向ini下一個group中寫一個key-value
--------使用c++的時候有時候會出現中文亂碼,解決方法以下:
char *g_old_locale=NULL; //設置GBK; char* pOracleLangVar; pOracleLangVar = getenv( "NLS_LANG" ); if(pOracleLangVar == NULL) { _putenv( "NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK" ); pOracleLangVar = getenv( "NLS_LANG" ); } //設置語言爲中文,不然在Unicode編碼下讀出中文字符爲亂碼 g_old_locale=_strdup( setlocale(LC_CTYPE,NULL) ); setlocale( LC_CTYPE,"chs"); ....................... 在此打開寫入文件或數據庫 ....................... setlocale( LC_CTYPE, g_old_locale ); //還原語言區域的設置 free( g_old_locale );//還原區域設定