亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cramsave.h

?? 此程序是一個模板類,主要改善大型數據的操作,效率很高,用的是靜態鏈表的原理
?? H
字號:
//文件名:CRAMSave.h
/*  
                                    創建者:徐立
	                                創建日期:2007.08
	                                版權所有@僅供學習交流使用
*/


/*##########################[     模板使用說明     ]####################################

    該模板主要用來存儲大量數據,它能夠對存儲的數據進行快速的遍歷
	使用方法:
·將模板實例化:CRAMSave<DATATYPE> RAM;  DATATYPE是任意一種數據類型,假設這里的DATATAYPE為int
  則為:CRAMSave<int> RAM;

·增加一個對象:int* pTemData=NULL;
                          pTemData=RAM.GetNewObject();
						  ......          //用pTemData指針對增加的對象賦值
·刪除一個對象:

·修改一個對象:

·對所有的對象進行遍歷,有三種方法.比如要把所有對象的值設成0:
  第一種方法(建議使用,要用兩個宏):
                          int *pTemData=NULL;
                          BEGIN_LOOP(RAM,pTemData,int)   //注意后面不要分號
						  *pTemData=0;
						  EDN_LOOP

  第二種方法(不建議使用,速度上要遜色很多):
                          for(int i=1;i<=RAM.GetTotalNum();i++)
						      {
							  pTemData=RAM.GetObject(i);
                              *pTemData=0;
							  }
 
  第三種方法(不建議使用,要求對模板結構比較熟悉,如果執意要使用,請參考第一種方法中的宏定義)









*/


#ifndef RAMSave_h 
#define RAMSave_h 1

#include "StdAfx.h"
#include <list>
using namespace std;
#define MAX_BLOCKNUM 16*256
//******************儲存的基本單元***************//
//成員nIndex的值從1開始;
template<class T>
struct Node
{
	T Object;
	UINT nIndex;//該對象的編號
	UINT nNext;//指向標記。若緊挨著該對象的下一個對象被刪除,nNext=2;若該對象后面連續有
	           //n個對象被刪除,nNext=n+1;后面緊跟著沒有對象刪除,nNext=1;
  
  
};	
//***********************************************//


template<class DATATYPE>
class CRAMSave
{
public:
	CRAMSave();
	~CRAMSave();

	



public://………………常用函數……………………//

	         UINT GetTotalNum()const;//獲得對象總個數;
	         UINT GetEachNum()const;//獲得每塊中存儲的對象個數;
             UINT GetBlockNum()const;//獲得塊的個數
			 UINT GetLastNum()const;//獲得最后一個數據塊的對象數
			 UINT GetFactTotalNum()const;//獲得實際對象總數
			 Node<DATATYPE> *GetBlockPtr(UINT blockNO);

             //功能:獲取一個新對象
			 //參數:
	         //說明: 所獲取的對象為空對象,要用戶自己給新對象賦值
			 DATATYPE* GetNewObjectPtr();

             //功能:獲得一個對象
		     //參數:(對象編號)
			 //說明:
			 DATATYPE* GetObjectPtr(UINT nIndex) ;

             //功能:刪除一個對象
			 //參數:(對象編號)
			 //說明: 
			 BOOL DeleteObject(UINT nIndex);
			 
             //功能:刪除一個對象
			 //參數:(對象指針)
			 //說明: 
			 BOOL DeleteObject(DATATYPE* pData);

			 //功能:獲得一個新對象
			 //參數:(對象編號)
			 //說明:
             DATATYPE* operator[](UINT nIndex);
//…………………………………………………………………………//


public://………………非常用函數…………………………//

			 

			 //功能:獲得一個包含對象的節點
		     //參數:(對象編號)
			 //說明:
			 //Node *GetNode(UINT nIndex) const;

             //功能:刪除一個節點
			 //參數:(對象編號)
			 //說明: 
			// BOOL DeleteNode(UINT nIndex);


//………………………………………………………………………………//

protected:
	         BOOL _AddNewBlock();




private:
	//***********以下幾個變量,被刪除的對象算在內******************//
	UINT m_nBlockNum;//總的塊數
    UINT m_nEachNum;//每塊含有的對象個數,每塊的最后一個對象是空的,包括最后一個對象
	UINT m_nLastNum;// 最后一塊含有的對象個數;
	UINT m_nTotalNum;//所存儲的對象總數,不包括每塊的最后一個對象
    //***********************************************************************

private:
    UINT m_nFactTotalNum;//所存儲的對象總數,不包括刪除的對象和每塊的最后一個對象
	Node<DATATYPE>* m_pBlockHead[MAX_BLOCKNUM];//主要用來存儲每個數據塊的首地址
    
	 


};



template<class DATATYPE>
CRAMSave<DATATYPE>::CRAMSave()
{
  m_nBlockNum=0;
  m_nTotalNum=0;
  m_nFactTotalNum=0;
  m_nEachNum=UINT(64*1024/sizeof(Node<DATATYPE>));
  m_nLastNum=0;
  
  for (int i=0;i<MAX_BLOCKNUM;i++) 
  {
     m_pBlockHead[i]=NULL;
  }
  if(!_AddNewBlock())
  {
     ASSERT(NULL);
	  AfxMessageBox("哈哈!怎么受傷的總是你!為電腦加點內存吧! 程序將中斷運行!");
  }
}

template<class DATATYPE>
CRAMSave<DATATYPE>::~CRAMSave()
{
 for (int i=0;i<m_nBlockNum;i++) 
 {
	 delete []m_pBlockHead[i];
 }
}

template<class DATATYPE>
UINT CRAMSave<DATATYPE>::GetBlockNum() const
{
	return m_nBlockNum;
}

template<class DATATYPE>
UINT CRAMSave<DATATYPE>::GetEachNum() const
{
	return m_nEachNum;
}

template<class DATATYPE>
UINT CRAMSave<DATATYPE>::GetTotalNum() const
{
	return m_nTotalNum;
}

template<class DATATYPE>
UINT CRAMSave<DATATYPE>::GetFactTotalNum() const
{
	return m_nFactTotalNum;
}

template<class DATATYPE>
UINT CRAMSave<DATATYPE>::GetLastNum() const
{
	return m_nLastNum;
}

template<class DATATYPE>
Node<DATATYPE>* CRAMSave<DATATYPE>::GetBlockPtr(UINT blockNO)
{
	ASSERT(blockNO>0&&blockNO<=m_nBlockNum);
	if (blockNO<0||blockNO>m_nBlockNum) 
    return NULL;
	return m_pBlockHead[blockNO-1];
}

template<class DATATYPE>
BOOL CRAMSave<DATATYPE>::_AddNewBlock()
{
	Node<DATATYPE>* pTemBlock=NULL;
  pTemBlock=new Node<DATATYPE>[m_nEachNum];
  if (pTemBlock) 
  {
	    for (int i=0;i<m_nEachNum;i++) 
		{
         pTemBlock[i].nIndex=0;
	     pTemBlock[i].nNext=0;
		}
		//pTemBlock[m_nEachNum-1]=0;//特殊處理,每塊最后一個對象存儲的偏移量為0(主要是為了防止指針溢出)
        m_pBlockHead[m_nBlockNum]=pTemBlock;
	    m_nBlockNum++;
	    return TRUE;
  }
  else return FALSE;
}

template<class DATATYPE>
DATATYPE* CRAMSave<DATATYPE>::GetNewObjectPtr()
{
  Node<DATATYPE>* pTemBlock=NULL;
  m_nTotalNum++;
  m_nFactTotalNum++;
  if (m_nLastNum<m_nEachNum-1)
  {
    pTemBlock=m_pBlockHead[m_nBlockNum-1];
	ASSERT(pTemBlock);
	pTemBlock[m_nLastNum].nIndex=m_nTotalNum;
    pTemBlock[m_nLastNum].nNext=1;
	m_nLastNum++;
	return &(pTemBlock[m_nLastNum-1].Object);
  }
  else
  {
	  if(_AddNewBlock())
	  {
	m_nLastNum=1;
	pTemBlock=m_pBlockHead[m_nBlockNum-1];
	ASSERT(pTemBlock);
	pTemBlock[0].nIndex=m_nTotalNum;
	return &(pTemBlock[0].Object);

	  }

	   ASSERT(NULL);
	  AfxMessageBox("內存不足耶! 程序將要中斷運行!");
	  exit(1);
  }
  
}



template<class DATATYPE>
DATATYPE* CRAMSave<DATATYPE>::GetObjectPtr(UINT nIndex)      
{
	if (nIndex<1||nIndex>m_nTotalNum)
	{
	    ASSERT(NULL);
		return NULL;
	}
	UINT BlockNO=1;
	UINT EachNO=1;
	UINT ntemVar=0;
	ntemVar=UINT(nIndex/m_nEachNum);
	EachNO=nIndex-ntemVar*m_nEachNum;
	if (0==EachNO) //若剛好是某塊的最后一個對象
		return NULL;
	Node<DATATYPE>* pTemBlock=NULL;
	pTemBlock=m_pBlockHead[ntemVar];
	if (0==pTemBlock[EachNO-1].nIndex) 
    return NULL;
	return &(pTemBlock[EachNO-1].Object);

}

template<class DATATYPE>
BOOL CRAMSave<DATATYPE>::DeleteObject(UINT nIndex)    
{
	if (nIndex<1||nIndex>m_nTotalNum)
	return FALSE;

//	UINT BlockNO=1;
	UINT EachNO=1;
	UINT ntemVar=0;
	ntemVar=UINT(nIndex/m_nEachNum);
	EachNO=nIndex-ntemVar*m_nEachNum;
	if (0==EachNO) //若剛好是某塊的最后一個對象
		return TRUE;
    Node<DATATYPE>* pTemBlock=NULL;
	pTemBlock=m_pBlockHead[ntemVar];
	if (0==pTemBlock[EachNO-1].nIndex) return TRUE;//若該對象已經被刪除
   pTemBlock[EachNO-1].nIndex=0;
	for (UINT i=2;i<EachNO+1;i++)//往左邊開始追溯
	{
		if (0==pTemBlock[EachNO-i].nIndex)//若前一個對象已經被刪除
		{
		  pTemBlock[EachNO-i].nNext=pTemBlock[EachNO-i].nNext+pTemBlock[EachNO-1].nNext;
          continue;
		}
		else
		{
         pTemBlock[EachNO-i].nNext=pTemBlock[EachNO-i].nNext+pTemBlock[EachNO-1].nNext;
		 break;
		}

	}	
   m_nFactTotalNum--;
   return TRUE;

}

template<class DATATYPE>
BOOL CRAMSave<DATATYPE>::DeleteObject(DATATYPE* pData)    
{

	   UINT index=0;
       Node<DATATYPE>* pTemBlock=NULL;
       for (UINT i=0;i<m_nBlockNum;i++ ) 
	   {
         pTemBlock=m_pBlockHead[i];
          if (0==pTemBlock->nNext)
			pTemBlock=pTemBlock+pTemBlock->nNext;
          while (0!=pTemBlock->nNext)
		  {
           if (pData==&(pTemBlock->Object)) 
		   { 
            index=pTemBlock->nIndex;
			break;
           }
           pTemBlock=pTemBlock+pTemBlock->nNext;
		  }
		  if(index!=0)
			  break;
	   }
     DeleteObject(index);
	 return TRUE;


	
  	


}


template<class DATATYPE>
DATATYPE* CRAMSave<DATATYPE>::operator[](UINT nIndex) 
{
	if (nIndex<1||nIndex>m_nTotalNum)
	{
        //AfxMessageBox("所要找的對象不存在!  將返回一個空對象");
		return NULL;
	}
	UINT BlockNO=1;
	UINT EachNO=1;
	UINT ntemVar=0;
	ntemVar=UINT(nIndex/m_nEachNum);
	EachNO=nIndex-ntemVar*m_nEachNum;
	if (0==EachNO) //若剛好是某塊的最后一個對象
		return NULL;
	Node<DATATYPE>* pTemBlock=NULL;
	pTemBlock=m_pBlockHead[ntemVar];
	if (0==pTemBlock[EachNO-1].nIndex) 
    return NULL;
	return &(pTemBlock[EachNO-1].Object);
}
			

	
//參數說明:(CRAMSave對象,DATATYPE類型的指針,DATATYPE類型)

#define BEGING_LOOP(RAM,pData,DATATYPE)   \
	   Node<DATATYPE>* pTemBlockMarco=NULL;\
       for (UINT nLoopVarMarco=1;nLoopVarMarco<=RAM.GetBlockNum();nLoopVarMarco++ ) {\
        pTemBlockMarco=RAM.GetBlockPtr(nLoopVarMarco);\
        if (0==pTemBlockMarco->nNext)\
			pTemBlockMarco=pTemBlockMarco+pTemBlockMarco->nNext;\
          while (0!=pTemBlockMarco->nNext){pData=&(pTemBlockMarco->Object);

          

#define END_LOOP pTemBlockMarco=pTemBlockMarco+pTemBlockMarco->nNext;\
        }\
	   }
	 
	    

	 




	




#endif

/*
在后面的宏定義中如果寫成
RAM.GetpBlock()=*(RAM.GetIterator());會報錯
定義一個中間變量即可解決

如果直接在宏其中定義:Node* pp;也會報錯
所以先要把Node 定義在CRAMSave的外面,再在宏中定義:Node<DataType> *pp;即可

注意:宏定義時一定不能有空行

內存開辟時,計算機自動按4字節對齊。如果一個對象大小為m,指針加一,地址上移動m;指針變量的大小是4個字節


















  */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色呦呦网站一区| 国产亚洲短视频| 日韩av电影天堂| 亚洲欧洲色图综合| 国产清纯白嫩初高生在线观看91| 欧美一区二区人人喊爽| 91麻豆成人久久精品二区三区| 国产精品亚洲人在线观看| 毛片不卡一区二区| 美国十次了思思久久精品导航| 国产成人欧美日韩在线电影| 国产高清精品久久久久| 欧美三级视频在线观看| 欧美日韩国产大片| 91精品国产91久久综合桃花| 国产精品久久久久久久久久久免费看| 国产精品色眯眯| 最新国产の精品合集bt伙计| 亚洲四区在线观看| 国产露脸91国语对白| 在线电影一区二区三区| 精品黑人一区二区三区久久| 精品福利av导航| 亚洲第一激情av| 蜜桃视频第一区免费观看| 色婷婷久久久综合中文字幕| 国产女人aaa级久久久级| 另类综合日韩欧美亚洲| 国产精华液一区二区三区| 欧美人狂配大交3d怪物一区| 尤物在线观看一区| 奇米综合一区二区三区精品视频| 另类欧美日韩国产在线| 欧美精选在线播放| 亚洲一区二区影院| 国产一区二区免费看| 97超碰欧美中文字幕| 69精品人人人人| 国产喂奶挤奶一区二区三区| 狠狠色综合日日| 色偷偷88欧美精品久久久| 国产精品国产三级国产三级人妇| 国产精品一二三在| 国产视频一区二区在线观看| 国产成人精品免费看| 国产日韩在线不卡| 成人精品一区二区三区四区| 欧美日本在线看| 日韩高清在线不卡| 欧美不卡激情三级在线观看| 亚洲欧美电影院| 韩国精品免费视频| 国产亚洲制服色| 成人爽a毛片一区二区免费| 国产精品免费免费| 色美美综合视频| 久久欧美中文字幕| 日韩精品五月天| 91网站最新地址| 亚洲午夜精品在线| 色综合久久综合网欧美综合网| 亚洲精品国产成人久久av盗摄| 在线欧美小视频| 亚洲欧洲性图库| 欧美日韩你懂得| 激情文学综合插| 国产精品国产自产拍在线| 欧美亚洲尤物久久| 一区二区三区资源| 91免费版pro下载短视频| 亚洲第一久久影院| 国产亚洲一区二区在线观看| 91视频在线观看免费| 三级影片在线观看欧美日韩一区二区 | 色婷婷av一区二区三区软件| 亚洲一二三四在线| 久久久影院官网| 91久久精品日日躁夜夜躁欧美| 日韩影视精彩在线| 日本一区二区成人在线| 美女视频黄a大片欧美| 日本一区二区成人| 91精品国产麻豆国产自产在线| 国产精品一区二区三区网站| 亚洲美女视频一区| 久久嫩草精品久久久精品| 色哦色哦哦色天天综合| 紧缚奴在线一区二区三区| 精品999在线播放| 在线观看视频一区二区欧美日韩| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲另类在线一区| 日本一区二区三区高清不卡| 欧美伦理电影网| 99精品欧美一区二区三区综合在线| 欧美aaaaa成人免费观看视频| 亚洲欧美日韩在线| 国产日产亚洲精品系列| 日韩午夜激情av| 国产美女视频91| 视频一区二区三区中文字幕| 国产精品久久久久aaaa樱花| 26uuu国产电影一区二区| 国产在线播放一区| 日本成人超碰在线观看| 一区二区三区国产豹纹内裤在线| 久久影视一区二区| 日韩一区二区三区四区| 欧美日韩黄色影视| 在线看日本不卡| 97久久精品人人做人人爽| 国产黄人亚洲片| 精品亚洲国产成人av制服丝袜| 亚洲444eee在线观看| 亚洲精品国产精品乱码不99 | 在线视频一区二区三区| 暴力调教一区二区三区| 亚洲成av人片| 亚洲成人高清在线| 亚洲午夜久久久久中文字幕久| 综合久久国产九一剧情麻豆| 国产精品污网站| 国产日韩欧美激情| 国产精品私人自拍| 中文字幕亚洲一区二区av在线| 国产欧美日韩激情| 国产精品久久久久久久久图文区 | 欧美aaaaaa午夜精品| 蜜臀av性久久久久蜜臀aⅴ| 日韩国产精品久久久| 日本vs亚洲vs韩国一区三区| 日本成人超碰在线观看| 日本午夜一区二区| 久久99精品国产麻豆婷婷| 国产一区中文字幕| 高清成人免费视频| 日本不卡的三区四区五区| 日本va欧美va精品发布| 一本色道久久综合亚洲aⅴ蜜桃| 成人avav影音| 久久精品国产久精国产| 精品一区二区三区免费观看| 国产精品18久久久久久久久久久久 | 日韩免费性生活视频播放| www.性欧美| 色悠久久久久综合欧美99| 欧美日韩视频在线第一区 | 日本三级亚洲精品| 久久电影国产免费久久电影| 国产激情视频一区二区在线观看| bt欧美亚洲午夜电影天堂| 日本高清视频一区二区| 日韩西西人体444www| 国产精品久久一级| 亚洲成a天堂v人片| 激情都市一区二区| 在线观看亚洲a| 精品美女一区二区| 亚洲欧美综合色| 日韩专区中文字幕一区二区| 国产精品综合二区| 欧美影院一区二区三区| 精品噜噜噜噜久久久久久久久试看 | 日韩欧美一区中文| 国产精品久99| 日本网站在线观看一区二区三区 | av中文字幕一区| 91麻豆精品国产91久久久| 中文字幕免费不卡| 日日噜噜夜夜狠狠视频欧美人| 国产+成+人+亚洲欧洲自线| 欧美网站大全在线观看| 国产欧美一区二区精品仙草咪| 亚洲男女毛片无遮挡| 久久99精品视频| 在线观看网站黄不卡| 国产欧美日韩综合| 青青草视频一区| 色菇凉天天综合网| 国产人伦精品一区二区| 免费在线观看不卡| 欧美在线一区二区三区| 国产三级久久久| 久久精品噜噜噜成人av农村| 色久优优欧美色久优优| 国产精品人成在线观看免费| 青青草一区二区三区| 欧美性一二三区| 国产精品久久精品日日| 国产精品一区在线观看你懂的| 777xxx欧美| 亚洲五码中文字幕| 色视频成人在线观看免| 中文字幕欧美日韩一区| 激情六月婷婷综合| 欧美大胆一级视频| 日本欧美肥老太交大片| 8v天堂国产在线一区二区| 亚洲午夜久久久久久久久电影院 | 国产成人av自拍|