[問題] 用指標指向vector的element?

看板C_and_CPP作者 (執著)時間14年前 (2010/05/01 19:21), 編輯推噓1(1019)
留言20則, 6人參與, 最新討論串1/3 (看更多)
我想讓"指標""一直"指向某個vector的元素, 請問有無可能。 事實上這在VC是不行的。 我知道vector可能發生reallocate memory的情形。 所以就算某個指標某個時候指向vector的一個element, 一旦有reallocate的情形(如某次push_back), 就不再保證指向同一個element。例如以下code在VC會出現執行時期錯誤: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include<iostream> #include<vector> int main() { vector<int> v; v.push_back(0); int *p = &(*(v.begin())); v.push_back(1); cout<<*p; // error! } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include<iostream> #include<vector> int main() { vector<int> v; v.push_back(0); vector<int>::iterator p = v.begin(); v.push_back(1); cout<<*p; // error! } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 甚至不用指標,改用iterator,也一樣會出問題。 所以請問除了指標、iterator,難道只剩index可以一直指向vector同一個element嗎? index的用法如: int p = 0; cout<<v[p]; -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.221.79

05/01 19:32, , 1F
面對現實吧,沒有。
05/01 19:32, 1F

05/01 19:33, , 2F
假設 capacity 已知,你先 reserve 好就有機會。
05/01 19:33, 2F

05/01 19:34, , 3F
不然你可能要選其它資料結構,如 list。
05/01 19:34, 3F

05/01 21:13, , 4F
謝謝樓上。我想這是很不錯的錯誤經驗,原來vector有這種特性
05/01 21:13, 4F

05/01 21:14, , 5F
其實我也想過,似乎list不會遇到這種reallocation的問題,不
05/01 21:14, 5F

05/01 21:16, , 6F
過我還是有疑慮。如果C++標準沒有定義list不許reallocation,
05/01 21:16, 6F

05/01 21:16, , 7F
,那實作不一定不會reallocation。
05/01 21:16, 7F

05/01 21:17, , 8F
STL 陷阱怎麼那麼多 @@
05/01 21:17, 8F

05/01 21:57, , 9F
這樣寫有什麼好處嗎,為什麼不要到處都寫p=&(v[i])?
05/01 21:57, 9F

05/01 22:18, , 10F
樓上,我原先覺得我的程式用index來access有點冗長,所以才
05/01 22:18, 10F

05/01 22:18, , 11F
會想用指標的東西。
05/01 22:18, 11F

05/01 22:19, , 12F
至於p=&(v[i])仍然會有問題的。
05/01 22:19, 12F

05/01 22:22, , 13F
對不起,我之前範例一有打錯。
05/01 22:22, 13F
※ 編輯: zxvc 來自: 218.168.4.191 (05/01 22:31)

05/01 23:55, , 14F
標準有說 list 會是雙向的 linked list,所以你放心吧。
05/01 23:55, 14F

05/01 23:56, , 15F
而且標準有說不管你怎麼 insert 新元素到 list,iterator
05/01 23:56, 15F

05/01 23:56, , 16F
一定不會變成 invlidate。如果有 list 會 reallocation 的
05/01 23:56, 16F

05/01 23:57, , 17F
,你可以去買一本資料結構教科書去砸那個實作者的頭。
05/01 23:57, 17F

05/02 00:03, , 18F
這個node我不喜歡 丟掉換一個(誤
05/02 00:03, 18F

05/02 08:04, , 19F
謝謝t大,了解了。
05/02 08:04, 19F

05/02 11:17, , 20F
t大的說法應是沒錯(我看書的記憶也是這樣@@")
05/02 11:17, 20F
文章代碼(AID): #1Bt0x4_Q (C_and_CPP)
文章代碼(AID): #1Bt0x4_Q (C_and_CPP)