C++筆記

 

-------------------------查找代碼和相關主題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 則不會

引用
CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
[[/S] [/C | /K] string]

/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模式下調試程序,能夠以下設置:

 

vs2010中設置在Release模式下調試的方法:
1.工程項目上右鍵 -> 屬性
2.c++ -> 常規 -〉調試信息格式    選  程序數據庫(/Zi)或(/ZI), 注意:若是是庫的話,只能(Zi)
3.c++ -> 優化 -〉優化            選  禁止(/Od)
4.鏈接器 -〉調試 -〉生成調試信息 選  是 (/DEBUG
vc6中設置在Release模式下調試的方法:
一、在Project Settings裏選Settings For爲All Configurations。
二、在C/C++標籤中,Debug info 選 Program Database。
三、在Link 標籤中,Category選 Debug,選中Debug info 複選框和Microsoft format。

 

---------------------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();
}
View Code

---------全角轉半角

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();
}
View Code

---------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 );//還原區域設定
View Code
相關文章
相關標籤/搜索