• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            萬星星@豌豆莢 歡迎加入我們
            一個(gè)吃軟飯的男人!!!!!我只想寫程序####
            微博:http://weibo.com/wanlianwen
            posts - 172,  comments - 1253,  trackbacks - 0

            一個(gè)學(xué)期課程結(jié)束,接著去公司改bug。以前做的一個(gè)網(wǎng)格控件老是出問題,于是下狠心重新實(shí)現(xiàn)一個(gè)!

            準(zhǔn)備實(shí)現(xiàn)一個(gè)網(wǎng)格數(shù)據(jù)結(jié)構(gòu),來存儲網(wǎng)格控件數(shù)據(jù)。為了以后也可以使用,寫了一個(gè)模板類,基本思想是寫3個(gè)類:

            /********************************************************************
             created: 2006/01/12
             created: 12:1:2006   14:30
             filename:  E:\MyProject\WLWLib\WLWGrid\WLWGrid.h
             file path: E:\MyProject\WLWLib\WLWGrid
             file base: WLWGrid
             file ext: h
             author:  萬連文
             
             purpose: 為了存儲二維網(wǎng)格m×n數(shù)據(jù),實(shí)現(xiàn)插入刪除訪問
                用鏈表實(shí)現(xiàn),適合大數(shù)據(jù)量(非海量數(shù)據(jù))頻繁插入刪除使用
                不適合稀疏矩陣使用,不適合海量數(shù)據(jù),因?yàn)橄∈杈仃嚂速M(fèi)
                很多單元格,海量數(shù)據(jù)會浪費(fèi)很多單元格里面的指針
            *********************************************************************/

            // 網(wǎng)格單元類,存儲數(shù)據(jù),記錄方位
            template<class T>
            class WLWGridCell
            {
            public:
             WLWGridCell(T xData, WLWGridCell* pLeft=0, WLWGridCell* pUp=0, WLWGridCell* pRight=0, WLWGridCell* pDown=0)
             {
              SetData(xData);
              SetLeft(pLeft);
              SetRight(pRight);
              SetUp(pUp);
              SetDown(pDown);
              m_lReserve = 0;
             }
             ~WLWGridCell()
             {
              SetLeft(0);
              SetRight(0);
              SetUp(0);
              SetDown(0);
             }
             // 設(shè)置數(shù)據(jù)
             void   SetData(T xData);

             // 獲得數(shù)據(jù)
             T    GetData();

             // 設(shè)置保留數(shù)據(jù)
             void   SetReserve(long lReserve);

             // 獲得保數(shù)據(jù)
             long   GetReserve();
             
             // 設(shè)置上方單元
             void   SetUp(WLWGridCell* pUp);

             // 獲得上方單元
             WLWGridCell* GetUp();

             // 設(shè)置下方單元
             void   SetDown(WLWGridCell* pDown);

             // 獲得下方單元
             WLWGridCell* GetDown();

             // 設(shè)置左方單元
             void   SetLeft(WLWGridCell* pLeft);

             // 獲得左方單元
             WLWGridCell* GetLeft();

             // 設(shè)置右方單元
             void   SetRight(WLWGridCell* pRight);

             // 獲得右方單元
             WLWGridCell* GetRight();
            private:
             WLWGridCell* m_pUp;  // 上方單元
             WLWGridCell* m_pDown; // 下方單元
             WLWGridCell* m_pLeft; // 左方單元
             WLWGridCell* m_pRight; // 右方單元

             T    m_xData; // 存儲數(shù)據(jù)
             long   m_lReserve; // 保留數(shù)據(jù)
            };

            // 網(wǎng)格行類,存儲一行數(shù)據(jù)
            template<class T>
            class WLWGridRow
            {
            public:
             WLWGridRow(WLWGridRow<T>* pUp=0, WLWGridRow<T>* pDown=0)
             {
              m_pHead  = 0;
              m_pTail  = 0;
              m_pCurr  = 0;
              m_lReserve = 0;
              m_pUp  = pUp;
              m_pDown  = pDown;
             }
             ~WLWGridRow()
             {
              // 銷毀所有網(wǎng)格
              Empty();
             }

             // 獲得當(dāng)前的行頭指針
             WLWGridCell<T>* GetHead();

             // 獲得當(dāng)前的行尾指針
             WLWGridCell<T>* GetTail();

             // 設(shè)置上一行
             void   SetUpRow(WLWGridRow<T>* pUp);

             // 獲得上一行
             WLWGridRow<T>* GetUpRow();

             // 設(shè)置下一行
             void   SetDownRow(WLWGridRow<T>* pDown);

             // 獲得下一行
             WLWGridRow<T>* GetDownRow();

             // 獲得當(dāng)前的游標(biāo)指針
             WLWGridCell<T>* GetCurrent();

             // 按照索引獲得單元格
             WLWGridCell<T>* GetCellByIndex(int iIndex);

             // 按照單元格獲得索引,失敗返回-1
             int    GetIndexByCell(WLWGridCell<T>* pCell);

             // 當(dāng)前指針右移
             void   MoveNext();

             // 當(dāng)前指針左移
             void   MoveBack();

             // 當(dāng)前指針行頭
             void   MoveHead();

             // 當(dāng)前指針行尾
             void   MoveTail();

             // 判斷是否有下一個(gè)
             bool   HasNext();

             // 判斷是否有上一個(gè)
             bool   HasBack();

             // 判斷是否為空
             bool   IsEmpty();

             // 清空行數(shù)據(jù)
             void   Empty();

             // 設(shè)置保留數(shù)據(jù)
             void   SetReserve(long lReserve);

             // 獲得保數(shù)據(jù)
             long   GetReserve();

             // 添加一個(gè)單元格,bRight=true表示添加在pos后面
             // 可能修改m_pHead、m_pTail
             // 返回<0表示添加失敗;=0表示已存在;>0表示成功
             int    AddCell(WLWGridCell<T>* pCell, WLWGridCell<T>* pPos, bool bRight=true);
             
             // 添加一個(gè)單元格,iIndex是索引,bRight=true表示添加在iIndex后面
             // 可能修改m_pHead、m_pTail
             // 返回<0表示添加失敗;=0表示已存在;>0表示成功
             int    AddCell(WLWGridCell<T>* pCell, int iIndex, bool bRight=true);

             // 刪除指定單元格,可能修改m_pHead、m_pTail、m_pCurr
             void   DelCell(WLWGridCell<T>* pCell);

             // 刪除指定單元格,iIndex是索引,表示單元格的位置
             // 可能修改m_pHead、m_pTail、m_pCurr
             void   DelCell(int iIndex);

             // 查找指定值的單元格,失敗返回-1,否則返回索引
             int    Find(T x);

             // 重載[]運(yùn)算符
             WLWGridCell<T>* operator[](int iIndex);
            private:
             WLWGridCell<T>* m_pHead; // 記錄一行的頭
             WLWGridCell<T>* m_pTail; // 記錄一行的尾
             WLWGridCell<T>* m_pCurr; // 當(dāng)前游標(biāo)位置,遍歷的時(shí)候使用

             WLWGridRow<T>* m_pUp;  //上一行
             WLWGridRow<T>* m_pDown; //下一行
             long   m_lReserve; // 保留數(shù)據(jù)
            };

            // 網(wǎng)格類,實(shí)現(xiàn)二維表格結(jié)構(gòu)
            template<class T>
            class WLWGrid
            {
            public:
             WLWGrid()
             {
              m_pHead  = 0;
             }
             ~WLWGrid()
             {
              Empty();
             }
             // 獲得頭行
             WLWGridRow<T>* GetHead();

             // 獲得列數(shù)
             int    GetCols();

             // 獲得行數(shù)
             int    GetRows();

             // 判斷是否為空
             bool   IsEmpty();

             // 清空表格
             void   Empty();

             // 按照索引獲得行
             WLWGridRow<T>* GetRowByIndex(int iIndex);

             // 按照行獲得索引,失敗返回-1
             int    GetIndexByRow(WLWGridRow<T>* pRow);
             
             // 指定位置添加一行,bRight=true表示添加在pos后面
             // 可能修改m_pHead
             // 注意行的單元格數(shù)目必須等于Grid的列數(shù),否則不添加
             // 返回<0添加失敗,0已存在,>0添加成功
             int    AddRow(WLWGridRow<T>* pRow, WLWGridRow<T>* pPos, bool bDown=true);
             
             // 指定位置添加一行,iIndex是索引,bRight=true表示添加在pos后面
             // 可能修改m_pHead
             // 注意行的單元格數(shù)目必須等于Grid的列數(shù),否則不添加
             // 返回<0添加失敗,0已存在,>0添加成功
             int    AddRow(WLWGridRow<T>* pRow, int iIndex, bool bDown=true);

             // 指定位置添加值為xData的一行,bRight=true表示添加在pos后面
             // 可能修改m_pHead
             void   AddRow(T xData, WLWGridRow<T>* pPos, bool bDown=true);
             
             // 指定位置添加值為xData的一行,iIndex是索引,bRight=true表示添加在pos后面
             // 可能修改m_pHead
             void   AddRow(T xData, int iIndex, bool bDown=true);
             
             // 刪除指定行,可能修改m_pHead
             void   DelRow(WLWGridRow<T>* pRow);

             // 刪除指定索引的行,可能修改m_pHead
             void   DelRow(int iIndex);

             // 指定位置添加值為xData的一列,bRight表示在iIndex索引右面添加,否則在左面添加
             // 添加成功返回true
             bool   AddCol(T xData, int iIndex, bool bRight=true);

             // 刪除下標(biāo)為iIndex的一列
             void   DelCol(int iIndex);

             // 重載[]運(yùn)算符
             WLWGridRow<T>* operator[](int iIndex);
            private:
             WLWGridRow<T>* m_pHead; // 頭行

             // 更新行單元格的指針,確保兩行長度一致,否則會導(dǎo)致非預(yù)期結(jié)果(0指針除外)
             void   UpdateRowCellPtr(WLWGridRow<T>* pUp, WLWGridRow<T>* pDown);
            };

            化了接近一天時(shí)間寫完,并經(jīng)過簡單測試,沒有發(fā)現(xiàn)內(nèi)存泄漏問題。

            看測試截圖  表現(xiàn)網(wǎng)格結(jié)構(gòu)

            下載網(wǎng)格數(shù)據(jù)結(jié)構(gòu)及測試代碼

            希望大家下載使用,提出建議,報(bào)告bug,最重要是內(nèi)存泄漏問題,謝謝!

            posted on 2006-01-13 17:12 萬連文 閱讀(1295) 評論(4)  編輯 收藏 引用 所屬分類: 亂七八糟

            FeedBack:
            # re: 數(shù)據(jù)結(jié)構(gòu)之網(wǎng)格實(shí)現(xiàn)
            2006-01-16 10:36 | 小明
            意見來了。

            看一個(gè)庫的接口好壞,從使用者上看是一個(gè)好的角度

            你的測試代碼
            m_aRow = new WLWGridRow<int>();
            m_aRow->AddCell(new WLWGridCell<int>(1), m_aRow->GetTail());
            if(m_aGrid.AddRow(m_aRow, m_aGrid.GetHead()) < 0)


            1.為什么要new WLWGridCell<int>(0)
            這樣是不是更好
            m_aRow->AddCell(1, m_aRow->GetTail());

            2.如果使用者這樣寫
            WLWGridRow<int> wl;
            if(m_aGrid.AddRow(&wl, m_aGrid.GetHead()) < 0)
            程序會崩潰吧,兩次delete,STL容器使用的方法普遍是copy in,copy out,效率是要付出一些,但是很穩(wěn)定可靠

            如果一定是使用指針傳入,建議可以使用這樣聲明的方式
            Class WLWGrid
            ...
            int AddRow(WLWGridRow<T>* &pRow, WLWGridRow<T>* pPos, bool bDown=true)
            {
            pRow = 0; //avoid delete twice
            }

            WLWGridRow<T>* &pRow聲明成指針引用的形式,表明你是要代替使用者來管理節(jié)點(diǎn)類的生命周期

            3.其實(shí)使用vector< vector<type*> > 就能很好的實(shí)現(xiàn)你的需要,簡單可靠

            4.不要把template的實(shí)現(xiàn)放在cpp文件中



              回復(fù)  更多評論
              
            # re: 數(shù)據(jù)結(jié)構(gòu)之網(wǎng)格實(shí)現(xiàn)
            2006-01-16 20:26 | 萬連文
            非常感謝批評??!
            對于1建議非常好,當(dāng)時(shí)由于時(shí)間以及個(gè)人主觀因素沒有實(shí)現(xiàn)
            對于2由于現(xiàn)在在公司,沒法看,但是有可能是自己代碼有問題。里面的小技巧很少用,呆會研究一下,謝謝共享技術(shù)
            對于3我則不認(rèn)同,如果vector< vector<type*> >可以方便實(shí)現(xiàn)我的需求的話我不會花費(fèi)那么大代價(jià)了。其實(shí)一般獲取數(shù)據(jù)是可以滿足的,但是在插入和刪除數(shù)據(jù)時(shí)會非常麻煩(不在尾部的話)。還考慮到移動(dòng)數(shù)據(jù)的原因所以采用鏈表實(shí)現(xiàn),其實(shí)可以采用list實(shí)現(xiàn),處于一個(gè)想學(xué)數(shù)據(jù)結(jié)構(gòu)的朋友的建議才自己動(dòng)手的
            對于4其實(shí)我是違背了模板的思想,強(qiáng)制把實(shí)現(xiàn)放入cpp,可能會誤導(dǎo)他人,當(dāng)時(shí)只是為了玩玩,原以為可以show一下,沒想到貽笑大方了
            再次感謝小明兄,技術(shù)可見厲害。  回復(fù)  更多評論
              
            # re: 數(shù)據(jù)結(jié)構(gòu)之網(wǎng)格實(shí)現(xiàn)
            2006-01-16 22:12 | 萬連文
            問題一已經(jīng)修改,添加兩個(gè)接口函數(shù)
            // 添加一個(gè)單元格,bRight=true表示添加在pos后面
            // 可能修改m_pHead、m_pTail
            // 返回<=0表示添加失敗;>0表示成功
            int AddCell(T xData, WLWGridCell<T>* pPos, bool bRight=true);

            // 添加一個(gè)單元格,iIndex是索引,bRight=true表示添加在iIndex后面
            // 可能修改m_pHead、m_pTail
            // 返回<=0表示添加失敗;>0表示成功
            int AddCell(T xData, int iIndex, bool bRight=true);
            問題二無法修改,因?yàn)椴幌肟截?,使用的時(shí)候必須要交付內(nèi)存管理權(quán)限否則無法正確運(yùn)行,必須注意。  回復(fù)  更多評論
              
            # re: 數(shù)據(jù)結(jié)構(gòu)之網(wǎng)格實(shí)現(xiàn)
            2006-01-17 20:48 | 萬連文
            針對以上建議做如下修改:
            2006-1-16
            WLWGridRow類添加兩個(gè)函數(shù)接口以方便用戶使用:
            int AddCell(T xData, WLWGridCell<T>* pPos, bool bRight=true);
            int AddCell(T xData, int iIndex, bool bRight=true);

            2006-1-17
            WLWGridRow類和WLWGrid類接口傳遞指針方式改為傳遞指針引用,
            為了避免用戶傳入棧地址導(dǎo)致兩次析構(gòu),如:
            int AddCell(WLWGridCell<T>* pCell, int iIndex, bool bRight=true);
            改為:
            int AddCell(WLWGridCell<T>*& pCell, int iIndex, bool bRight=true);

            2006-1-17
            WLWGridRow類添加一個(gè)拷貝構(gòu)造函數(shù)  回復(fù)  更多評論
              
            簡歷下載
            聯(lián)系我

            <2006年4月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456

            常用鏈接

            留言簿(66)

            隨筆分類

            隨筆檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            婷婷国产天堂久久综合五月| 欧美综合天天夜夜久久| 国产成人久久精品二区三区| 青草国产精品久久久久久| 7777精品伊人久久久大香线蕉| 久久精品无码一区二区日韩AV | 久久国产免费| 久久精品国产精品亜洲毛片| 久久青青草原精品国产软件| 久久99精品国产99久久6| 韩国三级中文字幕hd久久精品| 久久久久婷婷| 久久久久久精品成人免费图片 | 中文字幕日本人妻久久久免费 | 无码国内精品久久人妻| 天天躁日日躁狠狠久久| 国产婷婷成人久久Av免费高清| 国产精品久久久久久久久| 久久精品一区二区| 一本一本久久a久久精品综合麻豆| 久久99九九国产免费看小说| 色婷婷综合久久久久中文一区二区 | 91久久九九无码成人网站| 午夜精品久久久久久| 奇米综合四色77777久久| 一本大道久久a久久精品综合| 久久久无码精品亚洲日韩软件| 色播久久人人爽人人爽人人片AV| 久久精品国产亚洲AV电影| 国产AⅤ精品一区二区三区久久| 一级A毛片免费观看久久精品| 性高湖久久久久久久久| 国产午夜精品久久久久九九| 国产精品久久久久久久人人看| 久久免费小视频| 亚洲精品乱码久久久久久按摩| 狠狠色综合久久久久尤物| 日韩人妻无码一区二区三区久久| 久久精品成人免费国产片小草| 精品国产乱码久久久久久郑州公司| 久久久久亚洲爆乳少妇无 |