作者loveme00835 (高金素箍)
看板C_and_CPP
標題Re: [問題] vector因為capacity改變而產生的segmen …
時間Wed Aug 17 05:17:54 2011
※ 引述《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