作者dryman (dryman)
看板EE_DSnP
標題[問題] Hash constructor
時間Fri Jan 8 21:09:18 2010
Hash的constructor長這樣:
Hash(): _numBuckets(0), _buckets(0) {};
Hash(size_t b) : _numBuckets(0), _buckets(0) { init(b); }
這樣會不會不safe啊?
沒有用Hash( a number) 的話就會生出一個完全不能用的Hash
沒有init..
還是說這種constructor有別的用意?
BTW vector真是一種神奇的STL
因為resize前後(capacity有改變)
iterator指到的東西都一樣
[] access到的東西也沒變
vector還有一個get_allocator()的function/method
可以這麼用
vector<int> myvector; // initial capcity = 0;
int *p=myvector.get_allocator().allocate(5); // myvector.capcity = 5;
我想應該還有其他的private member來處理access的問題
而iterator的private member應該不是*int而可能是**int(吧?)
這樣更改中間*int的值就可以正確的指向改變得資料了
不過這部份沒有繼續查下去,只是我的猜測啦:p
有請強者補充囉:)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.45.253.90
1F:推 timrau:改capacity請使用reserve(); resize後iterator仍然有效 01/08 22:19
2F:→ timrau:純屬運氣好,除了list(deque可能也行)以外請別這樣做... 01/08 22:19
3F:→ timrau:"C++ Standard Library"一書中皆有說明 01/08 22:20
4F:→ dryman:後來發現這個capacity跟我們實做adt.array時不同 01/08 22:41
5F:→ dryman:因為vector實際上是alloc max_size這麼大的空間 01/08 22:42
6F:→ dryman:我使用resize()時max_size是一樣的 01/08 22:42
7F:→ dryman:耶? 我推的好像還是有錯誤的樣子.. 01/08 22:44
8F:→ dryman:如一樓所說,改capacity應該用reserve() 01/08 22:45
9F:→ dryman:capacity還是alloc的大小,不過可以用reserve更改大小 01/08 22:46
10F:→ dryman:the true limit of vector is vector::max_size 01/08 22:47
11F:推 ric2k1:Hash() 是 default constructor, 比方說像是 BddMgr 的 01/08 22:58
12F:→ ric2k1:constructor 會先呼叫這個 constructor 然後在 init() 裏頭 01/08 22:59
13F:→ ric2k1:才去呼叫 Hash 的 init() 去 allocate buckets. 01/08 23:00
14F:→ ric2k1:是不 safe,所以你 Hash 裏的 function 應該要檢查_buckets 01/08 23:01
15F:→ ric2k1:是否為 NULL 01/08 23:02
16F:→ dryman:喔喔,soga! 01/08 23:04
17F:推 slinh:喔喔 01/08 23:05