最近写hashtable的实现的时候用模板类的思想,在普通int,long,double类型的时候测试时没问题的,当用到string的时候,一直有问题。
实现的equal函数是比较粗暴的使用两者所有对应内存字节是否相似来比较的。
bool equal(T a,T b){//用内存中字节的方法判断这块内存的对象的值是否相等,这样就不用关心结构内部的数据类型了 char *aCurret,*aEnd,*bCurret; aCurret=(char *)&a; aEnd=aCurret+sizeof(T); bCurret=(char *)&b; while((*aCurret==*bCurret)&&(aCurret!=aEnd)){ aCurret++; bCurret++; } if(aCurret==aEnd)return true; else false; }
我开始分析两者的数据结构是否相同的
struct data{ int a,b,c; int x; string str; };
temp.a=temp.b=temp.c=123;//string("213"); temp.x=i*1; temp.str=string("213");
两个赋成一样的值,由于sizeof(data)=48
分别观察结构体1(0012FB3C),和结构体2(0012FB6C)的差别
整数部分都一样,而string的部分开始不同
为什么string一样的值,会不同,原因应该是string的数据结构的问题
a=string("123"); b=string("12345678901234567890123"); printf("%d\n",sizeof(a)); printf("%d\n",sizeof(b));
再一测,果然有问题,打印结果都是32,相当于这里的32个字节里保存了一些基本信息,但是文字内容都放在了其他的地方!!!
可以明显的看到a,b的差别
如果字符短的话,string就把字符串放到buf里,buf占16个字节,而如果字符串比较长的话,就把字符串放到_Ptr所指向的内存里
_Mysize记录当前字符串的大小,_Myres记录当前动态的内存结束点(0开始)