Re: [問題] vector因為capacity改變而產生的segmen …

看板C_and_CPP (C/C++)作者 (高金素箍)時間14年前 (2011/08/17 05:17), 編輯推噓2(202)
留言4則, 2人參與, 最新討論串5/5 (看更多)
※ 引述《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)

08/17 09:33, , 1F
aggregation與composition指的是??
08/17 09:33, 1F

08/17 09:35, , 2F
用2維陣列比較好debug的原因是??
08/17 09:35, 2F

08/17 09:35, , 3F
感謝板大,現在沒時間,希望晚點可以跟您請教
08/17 09:35, 3F

08/17 14:16, , 4F
好久不見 loveme 大說,推一個!
08/17 14:16, 4F
文章代碼(AID): #1EIjw6Sk (C_and_CPP)
文章代碼(AID): #1EIjw6Sk (C_and_CPP)