精華區beta C_and_CPP 關於我們 聯絡資訊
兩種方向。 第一種是第一層用 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