警示后人:vector容易犯的一个错误
  • 板块学术版
  • 楼主konyakest
  • 当前回复15
  • 已保存回复15
  • 发布时间2023/1/5 23:13
  • 上次更新2024/1/18 13:08:52
查看原帖
警示后人:vector容易犯的一个错误
482660
konyakest楼主2023/1/5 23:13

先考考大家,这两段代码一样吗?

vector<int> v;
int mem=0;
int create_node(){
    v.push_back(0);
    return ++mem;
}
int f(int a){
	v[a]=create_node();
}
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

2023/1/5 23:13
加载中...