strSrc=strtok_s(strSrc,strDel,&next_s); while(strSrc) { strList.push_back(strSrc); strSrc=strtok_s(NULL,strDel,&next_s); } 二是我翻译上面截取的字符串用的公式 如 str=”X48500Y22500D03“ XYGDIJ不确定的省略的 我用下面的函数解析static void ReadXY(CString str,UINT &Gm,double &Xm,double &Ym,double &Im,double &Jm,UINT &Dm,double JDX,double JDY) { UINT iStartG=0;UINT iStartX=0;UINT iStartY=0;UINT iStartI=0;UINT iStartJ=0;UINT iStartD=0; UINT size=str.GetLength()-1; UINT i=0; for(;i<size;i++) { switch(str[i]) { case'G': iStartG=i+1; break; case'X': iStartX=i+1; if (iStartG!=0) {Gm=atoi(str.Mid(iStartG,i-iStartG)); iStartG=-1;} else if (iStartD!=0){Dm=atoi(str.Mid(iStartD,i-iStartD));iStartD=-1;} break; case'Y': iStartY=i+1; if (iStartX!=0) {Xm=atof(str.Mid(iStartX,i-iStartX))*JDX;iStartX=-1;} else if (iStartG!=0){Gm=atoi(str.Mid(iStartG,i-iStartG));iStartG=-1;} else if (iStartD!=0){Dm=atoi(str.Mid(iStartD,i-iStartD));iStartD=-1;} break; case'I': iStartI=i+1; if (iStartY!=0){Ym=atoi(str.Mid(iStartY,i-iStartY))*JDY;iStartY=-1;} else if (iStartX!=0) {Xm=atof(str.Mid(iStartX,i-iStartX))*JDX;iStartX=-1;} else if (iStartG!=0){Gm=atoi(str.Mid(iStartG,i-iStartG));iStartG=-1;} else if (iStartD!=0){Dm=atoi(str.Mid(iStartD,i-iStartD));iStartD=-1;} break; case'J': iStartJ=i+1; if (iStartI!=0){Im=atof(str.Mid(iStartI,i-iStartI))*JDX;iStartI=-1;} else if (iStartY!=0){Ym=atof(str.Mid(iStartY,i-iStartY))*JDY;iStartY=-1;} else if (iStartX!=0) {Xm=atof(str.Mid(iStartX,i-iStartX))*JDX;iStartX=-1;} else if (iStartG!=0){Gm=atoi(str.Mid(iStartG,i-iStartG));iStartG=-1;} else if (iStartD!=0){Dm=atoi(str.Mid(iStartD,i-iStartD));iStartD=-1;} break; case'D': iStartD=i+1; if (iStartJ!=0){Jm=atof(str.Mid(iStartJ,i-iStartJ))*JDY;iStartJ=-1;} else if (iStartI!=0){Im=atof(str.Mid(iStartI,i-iStartI))*JDX;iStartI=-1;} else if (iStartY!=0){Ym=atof(str.Mid(iStartY,i-iStartY))*JDY;iStartY=-1;} else if (iStartX!=0) {Xm=atof(str.Mid(iStartX,i-iStartX))*JDX;iStartX=-1;} else if (iStartG!=0){Gm=atoi(str.Mid(iStartG,i-iStartG));iStartG=-1;} break;
} } if (iStartD!=0){Dm=atoi(str.Mid(iStartD,i-iStartD+1));iStartD=-1;} else if (iStartJ!=0){Jm=atof(str.Mid(iStartJ,i-iStartJ+1))*JDY;iStartJ=-1;} else if (iStartI!=0){Im=atof(str.Mid(iStartI,i-iStartI+1))*JDX;iStartI=-1;} else if (iStartY!=0){Ym=atof(str.Mid(iStartY,i-iStartY+1))*JDY;iStartY=-1;} else if (iStartX!=0){Xm=atof(str.Mid(iStartX,i-iStartX+1))*JDX;iStartX=-1;} else if (iStartG!=0){Gm=atoi(str.Mid(iStartG,i-iStartG+1));iStartG=-1;} } 问题就是就这样子啦,5.1过我就结贴,不管问题能不能解决。感谢所有回答问题的同行,呵呵
如果需要遍历、查找,还是用stl比较好
//这是我要存储的对象
class CAction
{
public:
INT actionType;
SqStack<Point,2,4> moveList;//这里的长度不固定,此栈我自己用模板做的
bool LPC;
UINT apertureNum;
bool isathwart;
public:
//当然了,这里还有些函数我现在需要一个容器记住它,并且是大量的
vector< shared_ptr<class> >vector里面原则上不能放入 一个大数据的实例,而只能放入指针,因为vector的内容是顺序排列的,如果放入实例,插入删除的开销太高或者用list<class> 另外我很好奇:不管用什么容器,150w的数据占用的内存难道会不同么
这个用指针,在堆上分配
容器应该就可以用对象指针了作为元素了
class CAction
{
public:
INT actionType;//可否用unsigned short actionType?甚至char?
UINT apertureNum;//可否用unsigned short apertureNum
bool LPC;//可否与isathwart,合用一个char,那么你程序中就需要用bit运算分解。
bool isathwart;
//上面四个数据能否加起来只用4byte,否则数据对齐会增加不少内存。
SqStack<Point,2,4> moveList;//
public:
所以我就想,我的内存这么爆满,是否是最后的空间剩余太多,如果我牺牲下效率手动分配是否会有问题我这样的数据结构,一般一个vector中有19W个这样的对象,这样的vector有很多,一般总和超过150w另外我在这样的结构中创建函数,是否会对内存有影响。我对这方面了解不是很多,如果我在这里主动干扰虚拟
内存,比喻降低实际内存,提高物理内存,是否会有影响
所以我就想,我的内存这么爆满,是否是最后的空间剩余太多,如果我牺牲下效率手动分配是否会有问题如果你能预先确定vecotr的大小,先用reverse保留适当的空间,比如你估计有185000,你给reverse(185000),不够部分自动扩充空间也是可以的。应该效率更高。
完全临时自动扩充空间效率应该不高。另外我在这样的结构中创建函数,是否会对内存有影响。
在结构中创建函数与全局函数对内存印象没什么区别。一旦使用虚拟内存,速度就会下降非常大。一个vector中有19W,这样的vector有很多,一般总和超过150w。
你的总和怎么计算出来的?多个vector的数据是否可以不同时读进内存,需要时读进数据?你可以看看内存映射,读数据会非常快,读100m要不了多少时间。
strSrc=strtok_s(strSrc,strDel,&next_s);
while(strSrc)
{
strList.push_back(strSrc);
strSrc=strtok_s(NULL,strDel,&next_s);
}
二是我翻译上面截取的字符串用的公式
如 str=”X48500Y22500D03“
XYGDIJ不确定的省略的
我用下面的函数解析static void ReadXY(CString str,UINT &Gm,double &Xm,double &Ym,double &Im,double &Jm,UINT &Dm,double JDX,double JDY)
{
UINT iStartG=0;UINT iStartX=0;UINT iStartY=0;UINT iStartI=0;UINT iStartJ=0;UINT iStartD=0;
UINT size=str.GetLength()-1;
UINT i=0;
for(;i<size;i++)
{
switch(str[i])
{
case'G':
iStartG=i+1;
break;
case'X':
iStartX=i+1;
if (iStartG!=0) {Gm=atoi(str.Mid(iStartG,i-iStartG)); iStartG=-1;}
else if (iStartD!=0){Dm=atoi(str.Mid(iStartD,i-iStartD));iStartD=-1;}
break;
case'Y':
iStartY=i+1;
if (iStartX!=0) {Xm=atof(str.Mid(iStartX,i-iStartX))*JDX;iStartX=-1;}
else if (iStartG!=0){Gm=atoi(str.Mid(iStartG,i-iStartG));iStartG=-1;}
else if (iStartD!=0){Dm=atoi(str.Mid(iStartD,i-iStartD));iStartD=-1;}
break;
case'I':
iStartI=i+1;
if (iStartY!=0){Ym=atoi(str.Mid(iStartY,i-iStartY))*JDY;iStartY=-1;}
else if (iStartX!=0) {Xm=atof(str.Mid(iStartX,i-iStartX))*JDX;iStartX=-1;}
else if (iStartG!=0){Gm=atoi(str.Mid(iStartG,i-iStartG));iStartG=-1;}
else if (iStartD!=0){Dm=atoi(str.Mid(iStartD,i-iStartD));iStartD=-1;}
break;
case'J':
iStartJ=i+1;
if (iStartI!=0){Im=atof(str.Mid(iStartI,i-iStartI))*JDX;iStartI=-1;}
else if (iStartY!=0){Ym=atof(str.Mid(iStartY,i-iStartY))*JDY;iStartY=-1;}
else if (iStartX!=0) {Xm=atof(str.Mid(iStartX,i-iStartX))*JDX;iStartX=-1;}
else if (iStartG!=0){Gm=atoi(str.Mid(iStartG,i-iStartG));iStartG=-1;}
else if (iStartD!=0){Dm=atoi(str.Mid(iStartD,i-iStartD));iStartD=-1;}
break;
case'D':
iStartD=i+1;
if (iStartJ!=0){Jm=atof(str.Mid(iStartJ,i-iStartJ))*JDY;iStartJ=-1;}
else if (iStartI!=0){Im=atof(str.Mid(iStartI,i-iStartI))*JDX;iStartI=-1;}
else if (iStartY!=0){Ym=atof(str.Mid(iStartY,i-iStartY))*JDY;iStartY=-1;}
else if (iStartX!=0) {Xm=atof(str.Mid(iStartX,i-iStartX))*JDX;iStartX=-1;}
else if (iStartG!=0){Gm=atoi(str.Mid(iStartG,i-iStartG));iStartG=-1;}
break;
}
}
if (iStartD!=0){Dm=atoi(str.Mid(iStartD,i-iStartD+1));iStartD=-1;}
else if (iStartJ!=0){Jm=atof(str.Mid(iStartJ,i-iStartJ+1))*JDY;iStartJ=-1;}
else if (iStartI!=0){Im=atof(str.Mid(iStartI,i-iStartI+1))*JDX;iStartI=-1;}
else if (iStartY!=0){Ym=atof(str.Mid(iStartY,i-iStartY+1))*JDY;iStartY=-1;}
else if (iStartX!=0){Xm=atof(str.Mid(iStartX,i-iStartX+1))*JDX;iStartX=-1;}
else if (iStartG!=0){Gm=atoi(str.Mid(iStartG,i-iStartG+1));iStartG=-1;}
}
问题就是就这样子啦,5.1过我就结贴,不管问题能不能解决。感谢所有回答问题的同行,呵呵