[問題] reference的使用

作者: oToToT (屁孩)   2018-03-15 21:50:34
開發平台(Platform): (Ex: Win10, Linux, ...)
OSX El Capitan
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
Homebrew GCC 7.2.0
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
C++ 預設 STL
問題(Question):
我想要把資料傳入function後,他再依據傳入的值,去執行該做的事
結束後把state改掉,這樣在接下來的時候就不會走到同樣的state
餵入的資料(Input):

預期的正確結果(Expected Output):
0
9
8
7
6
5
4
3
2
1
錯誤結果(Wrong Output):
0
9
0
7
6
terminated by signal SIGSEGV (Address boundary error)
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
#include <iostream>
#include <vector>
using namespace std;
vector<int> arr;
int obov(){
arr.push_back(0);
return arr.size()-1;
}
void myfunc(int& id){
if(arr.size()==10) return;
if(!id) id = obov();
myfunc(arr[id]);
cout << arr[id] << '\n';
}
int main(){
int a = obov();
myfunc(a); cout << a << '\n';
return 0;
}
( https://pastebin.com/upZsetu0 )
補充說明(Supplement):
似乎改寫成
int a = arr[id];
myfunc(a); arr[id] = a;
就不會有問題了,想請各位大大幫我指出問題點QQ
作者: edisonhello (edison)   2018-03-15 22:13:00
vector在插東西的時候有可能會長大(?你可以在每個obov裡面印一下&arr[i] 然後就發現會跳
作者: oToToT (屁孩)   2018-03-15 22:38:00
喔喔,因為他底層是指標類的東東QQ所以會寫到錯的地方
作者: edisonhello (edison)   2018-03-15 22:54:00
所以才會有iterator這種東西
作者: oToToT (屁孩)   2018-03-15 23:35:00
我發現我不會用iterator改寫這份code
作者: LPH66 (-6.2598534e+18f)   2018-03-16 00:04:00
你這個應該不能直接用 iterator 做, 理由類似在長大的時候舊的 iterator 會失效, 所以你回頭的時候依然會發生違規是有個避免長大的解法叫 .reserve() 就是了...
作者: steve1012 (steve)   2018-03-16 00:07:00
你是本來就想寫遞回嗎 然後為啥要傳vector element 的reference 回去?你可以傳 index… lol
作者: edisonhello (edison)   2018-03-16 00:20:00
喔喔 原來iterator也會爛... (剛剛實驗過了)那iterator到底是為了什麼而出現的啊
作者: jerryh001   2018-03-16 00:34:00
如果是list的話iterator就不會跑掉了
作者: stucode   2018-03-16 00:49:00
iterator 是為了抽象化容器的存取用的。例如實作一個找出容器中最大值的演算法,如果沒有 iterator 來抽象元素存取動作,對於像是 list 與 array 等疊代方式不同的容器,就需要針對每種容器各寫一份。
作者: steve1012 (steve)   2018-03-16 05:12:00
iterator 本來就有可能被 invalidate
作者: loveflames (咕啾咕啾魔法陣)   2018-03-16 09:27:00
只有關聯容器跟list能保證iterator有效性

Links booklink

Contact Us: admin [ a t ] ucptt.com