看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《Zoxge (Zoxge)》之銘言: 你所需要的只是引進一個簡單的類別來代替指標: http://codepad.org/CissFbXs PseudoPointer是一個類迭代器的類別, 它負責將索引容器連結起 來: std::vector<int> values; values.push_back( 3 ); values.push_back( 2 ); values.push_back( 1 ); typedef PseudoPointer<size_t, int> Pointer; Pointer ptr = Pointer( 2, values ); assert( *ptr == 1 ); 它所做的只是把 operator* 的呼叫轉送給目標容器的 operator[] 來完成任務, 你的 ABC 可以改寫成這樣, 需要變動的地方不多: http://codepad.org/TAPBdsTb 我猜想你在做的是有關圖形的題目, ABC 為 Vertex, _vIS 紀錄了 input edges 連到的端點, _vOS 記錄了 output edges 連的端點, 而所有指標的關係應該為aggregation而非composition, 所有節點 的記憶體空間都由vVec來管理, 新的程式碼使用起來就像這樣: // 創建兩點10、20 vector<ABC> vVec; vVec.push_back( ABC(10) ); vVec.push_back( ABC(20) ); // 點20有一條output edge連向點10 typedef PseudoPointer<size_t, ABC> Pointer; vVec.at( 1 ).setOS( Pointer(0, vVec) ); // 更新點20連出去的眾多點的input edges Pointer s = Pointer( 1, vVec ); for(size_t k=0; k<s->ossize(); k++) { s->os(k)->setIS(s); } // 確認點10有點20連過來的邊 std::cout << vVec.at( 0 ).is( 0 )->value << std::endl; 以你的使用情形來說, 物件和其在容器中索引的關係是不變的, 所 以紀錄索引紀錄記憶體位置來得自然. 本來我是用Observer來做, 讓容器成為Subject, 在capacity改變 的時候notify所有節點, 不過真的太麻煩了...最後放棄 Orz 如果節點數不多的話, 我建議你還是用一個2維陣列來標記吧, 這 樣偵錯會比較容易... 函式 setXX() 應該改命名為 addXX()... -- ★ ★ ███ ███ █▌█ ██◣ ███ ▋▋█ █▂█ █▃█ ███ █▆█ █▄█ ███ █ ◣ █ █ ▋██ █▆◤ ███ ███ Kim Jae Kyung Koh Woo Ri Cho Hyun Young Kim Ji Sook φwindyhorse No Eul Oh Seung A Jung Yoon Hye -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115 ※ 編輯: loveme00835 來自: 140.121.197.115 (08/17 09:24)
Zoxge:aggregation與composition指的是?? 08/17 09:33
Zoxge:用2維陣列比較好debug的原因是?? 08/17 09:35
Zoxge:感謝板大,現在沒時間,希望晚點可以跟您請教 08/17 09:35
xatier:好久不見 loveme 大說,推一個! 08/17 14:16