社区讨论

警示后人:vector容易犯的一个错误

学术版参与者 13已保存回复 15

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
15 条
当前快照
1 份
快照标识符
@lo3equha
此快照首次捕获于
2023/10/24 05:26
2 年前
此快照最后确认于
2024/01/18 13:08
2 年前
查看原帖
先考考大家,这两段代码一样吗?
CPP
vector<int> v;
int mem=0;
int create_node(){
    v.push_back(0);
    return ++mem;
}
int f(int a){
	v[a]=create_node();
}
CPP
vector<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_nodepush_back 一个元素,这可能导致 vector 的扩容,之前返回的引用失效
出处:https://www.luogu.com.cn/discuss/553366?page=2

回复

15 条回复,欢迎继续交流。

正在加载回复...