Re: [問題] vector因為capacity改變而產生的segmen …
※ 引述《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
08/17 09:33, 1F
→
08/17 09:35, , 2F
08/17 09:35, 2F
→
08/17 09:35, , 3F
08/17 09:35, 3F
推
08/17 14:16, , 4F
08/17 14:16, 4F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章