作者cppOrz (cppOrz)
看板C_and_CPP
標題Re: [請益] 以C++建構bucket,用vector,lisr,or new?
時間Sun Sep 4 15:46:38 2005
兩種方向。
第一種是第一層用 vector,這大概最直覺,至於第二層用什麼,
就稍微考慮一下,如果只有頭尾端操作就用 deque,有中間的插
入刪除動作就用 list。
如果 sizeof(Cell) 不大,就直接 vector<deque<Cell> >,否則
的話可考慮:
typedef boost::shared_ptr<Cell> CellPtr;
然後用 vector<deque<CellPtr> >,這樣就比較接近 Java 的慣用法
或是直接 vector<deque<Cell*> >,不過這樣用的話要自行處理
記憶體釋放的問題。
另外,如果第一層的每個節點最大不超過 N,且 N 及 sizeof(Cell)
都不大,也可以考慮自己實現一個簡易的 TinyList 或 TinyDeque
之類的(因為 vector 和 deque 的實作都會預先配置不小的記
憶體,如果第二層的密度不大,有點浪費),例如:
struct TinyDeque
{
... // PushFront, PopFront …等等
private:
Cell cell[N]; // N 是編譯期常量
};
然後再用 vector<TinyDeque>,或者也可以把 TinyDeque 寫成
template,彈性比較大。
第二種思考方向,是直接用 multimap 或 hash_multimap,例如:
multimap<int, Cell>
或者如果 sizeof(Cell) 相當大,可考慮:
multimap<int, CellPtr> 或 multimap<int, Cell*>
好處是比較簡明,缺點是原本 vector 對第一層可以 random access
,改用 multimap 效率稍差了一些。不過如果第二層相當稀疏的話,
我會 Prefer 這種。
※ 引述《sinclair ( )》之銘言:
: 為了實現一個驗算法,我需要建構一個動態的Bucket list
: 其結構大概如下所示:
: P(max) ->
: .
: .
: Ptr--> P( i ) -> Cell3
: .
: .
: P( 1 ) -> Cell2, Cell5, Cell6
: P( 0 ) -> Cell7
: P(-1 )
: P(-2 ) -> Cell1, Cell4
: .
: .
: P(min) -> Cell8
: 看起來像是一個二維陣列,但其實每一列P(i)其內含的Cell數目並不相同。
: P(i)的max,min會在資料處理過程往上(下)增加。
: P(i)內含的cell不需要考慮順序,也不會有sorting的動作,
: 在資料處理過程中,可能有將P(-2)的Cell4取出,並存入P(1)這類搬移的動作,
: 也有 Cell6從P(1)尾端取出後就丟掉,或再塞回P(1)前面的動作(塞到Cell2前面
: -----------------------------------------------------------
: 想破頭的分隔線 想破頭的分隔線 想破頭的分隔線
: -----------------------------------------------------------
: 我目前想到的是P(i)的內容可以用list的形式來儲存
: P(max)....P(min)可以用vector的形式儲存,因為可以用iterator來當Ptr指標
: 但是不知道要如何宣告這樣的一個結構,能不能請各位先進指點一下。
: 或是有其他更好的方法來處理這樣個資料結構。謝謝!感激不盡!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.214.120
推 freaky:cppOrz 真是熱心, 像我這種懶人都是順手回幾句:> 203.70.36.38 09/04
推 khoguan:cppOrz大大是前輩高人,也是本版的優秀楷模 ^^220.130.208.167 09/04