structure p
{
int handle;//句柄
int id;//序列号
int count;//序列号的总数
}程序是一个网络程序,比如,有一个大的数据包,在发送的时候,可以把这个大的包分为2个小包,序号分别为1,2,count的值是小包的数量2,我的程序,收到了小包以后,先把小包暂时保存在一个容器里面,等到把包接受完毕(id=count),就将包组装起来,发给程序处理。现在有几个问题
1.接受小包的时候,可能并不是按照顺序接受的,有可能先收到2,再收到1,组装的时候要求按照顺序组装。
2.如何快速查找相同handle的包?并且快速按照顺序排列主要是基于效率的考虑,不知道现在又没有现成能使用的容器?

解决方案 »

  1.   

    用 CMapWordToPtr来了数据后,将序号作为关键字存入
    CMapWordToPtr(index,&structure p )数据取完后CMapWordToPtr.GetCount();
    for( int i = 0 ; i < nCount ; i ++ )
    {
    P = NULL;
    IF( CMapWordToPtr.Lookup(i,&p) // 得到的P就是对应序号的
    {
        找到对应序号的包
    }
    }
      

  2.   

    实际上应该是先找到相同handle的数据不知道CMapWordToPtr 能用2个关键字吗?因为id可能相同的,handle+id是唯一的,就像数据库里的主码一样,其实如果是数据库的话,用一句sql语句就可以实现select handle,id ..from table where handle=.. order by id
      

  3.   


    你这种情况一般用hash_map吧。
      

  4.   

    暈...既然要用兩個加起來才能算是唯一鍵, 為何不弄個64位的整型直接判斷呢? 
    而且本身結構體就是Handle到ID的, 直接來個硬轉換 pint64 pi64 = @Data.
    然後pi64^的內容進行比較就知道有沒有重復了.既然你說是大數的數據, 直接建立一個 
     arpData [INT_MAX+INT_MAX]的數組
    然後用個簡單的結點來組建成隊列, 隊列的頭就是 64位整型在數組中對應的位置就是了...
    80行代碼都不用...
    就類的聲明都去20行了...需要找來找去麼... 
      

  5.   

    我晕,你用两个map不用行了第一个用于保存 handle->map对象
    找到的map对象中存id->obj...
    用MFC很方便,好多种map类供你存
    存handle的那个可以用 CMapDwordToPtr