社区讨论
警示后人:vector容易犯的一个错误
学术版参与者 13已保存回复 15
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 15 条
- 当前快照
- 1 份
- 快照标识符
- @lo3equha
- 此快照首次捕获于
- 2023/10/24 05:26 2 年前
- 此快照最后确认于
- 2024/01/18 13:08 2 年前
先考考大家,这两段代码一样吗?
CPPvector<int> v;
int mem=0;
int create_node(){
v.push_back(0);
return ++mem;
}
int f(int a){
v[a]=create_node();
}
CPPvector<int> v;
int mem=0;
int create_node(){
v.push_back(0);
return ++mem;
}
int f(int a){
int node=create_node();
v[a]=node;
}
答案是:不一样,后一个可以完成字面意思上的工作,前一个会有bug
理由:
v[a]=create_node();这样的语句是错的
c++的视角:
-
调用v的
operator []函数返回一个引用 -
调用
create_node函数,返回一个值(记作ret) -
将引用赋值为ret
问题是,
create_node 会 push_back 一个元素,这可能导致 vector 的扩容,之前返回的引用失效出处:https://www.luogu.com.cn/discuss/553366?page=2
回复
共 15 条回复,欢迎继续交流。
正在加载回复...