-------------------------查找代码和相关主题
http://www.oschina.net/code/snippet_12_1001
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“求和”算法
accumulate(A.begin(),A.end(),10); //可以理解为10+A[1]+A[2]+…
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;
}
int init = 100;
int numbers[] = {10,20,30};
int c=std::accumulate (numbers, numbers+3, init, myfunction);//可以理解为myfunction(myfunction(100, numbers[0]), numbers[1])......
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;
}
------------------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模式下调试程序,可以如下设置:
---------------------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 );//还原区域设定