作者oToToT (屁孩)
看板C_and_CPP
标题[问题] reference的使用
时间Thu Mar 15 21:50:34 2018
开发平台(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
--
╭─────────────────╮
│
远くへと広がる海の色暖かく│
│
梦の中で描いた絵のようなんだ│
│
切なくて时をまきもどしてみるかい?│
│
No No No いまが最高!│
╰─────────────────╯ -
仆たちはひとつの光
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.193.102.192
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1521121864.A.B51.html
※ 编辑: oToToT (123.193.102.192), 03/15/2018 21:54:07
1F:→ edisonhello: vector在插东西的时候有可能会长大(? 03/15 22:13
2F:→ edisonhello: 你可以在每个obov里面印一下&arr[i] 然後就发现会跳 03/15 22:15
3F:→ oToToT: 喔喔,因为他底层是指标类的东东QQ所以会写到错的地方 03/15 22:38
4F:→ edisonhello: 所以才会有iterator这种东西 03/15 22:54
5F:→ oToToT: 我发现我不会用iterator改写这份code 03/15 23:35
6F:推 LPH66: 你这个应该不能直接用 iterator 做, 理由类似 03/16 00:04
7F:→ LPH66: 在长大的时候旧的 iterator 会失效, 所以你回头的时候 03/16 00:05
8F:→ LPH66: 依然会发生违规 03/16 00:05
9F:→ LPH66: 是有个避免长大的解法叫 .reserve() 就是了... 03/16 00:07
10F:推 steve1012: 你是本来就想写递回吗 然後为啥要传vector element 的 03/16 00:07
11F:→ steve1012: reference 回去? 03/16 00:07
12F:→ steve1012: 你可以传 index… lol 03/16 00:07
13F:→ edisonhello: 喔喔 原来iterator也会烂... (刚刚实验过了) 03/16 00:20
14F:→ edisonhello: 那iterator到底是为了什麽而出现的啊 03/16 00:20
15F:推 jerryh001: 如果是list的话iterator就不会跑掉了 03/16 00:34
16F:→ stucode: iterator 是为了抽象化容器的存取用的。例如实作一个找出 03/16 00:49
17F:→ stucode: 容器中最大值的演算法,如果没有 iterator 来抽象元素 03/16 00:50
18F:→ stucode: 存取动作,对於像是 list 与 array 等叠代方式不同的 03/16 00:50
19F:→ stucode: 容器,就需要针对每种容器各写一份。 03/16 00:50
20F:推 steve1012: iterator 本来就有可能被 invalidate 03/16 05:12
21F:→ loveflames: 只有关联容器跟list能保证iterator有效性 03/16 09:27