开了O2从AC变成WA50

P4284 [SHOI2014] 概率充电器

@[Martin_MHT](/user/112395) 在使用迭代器的过程中进行删除操作可能是原因。
by metaphysis @ 2021-07-19 17:55:43


@[metaphysis](/user/333388) 我搜索了正确的使用方法,没有发现有错误。如果可能,能提供正确的写法吗?
by Martin_MHT @ 2021-07-19 18:57:18


@[metaphysis](/user/333388) 我试着改成了这样: ```cpp for(vector<To>::iterator it = G[u].begin(); it != G[u].end(); ) if(it -> v ^ fa[u]) fa[it -> v] = u, q[++t] = it -> v, ++it; else { it = G[u].erase(it); if(it == G[u].end()) break ; //原本没有这个判断 } ``` 就正确了。能解释一下原因吗?
by Martin_MHT @ 2021-07-19 19:07:04


@[Martin_MHT](/user/112395) 我估计使用 O2 优化后,for 循环中的 G[u].end() 已经让编译器优化了,是一个固定的地址(如果不优化,每次在 for 循时,都会取 G[u] 当前的迭代器末尾进行比较),而您在迭代过程中,删除了元素,导致 G[u].end() 已经发生了改变,此时使用 G[u].end() 获取得到的是正确的迭代器末尾,但是 for 循环中的固定地址已经不是当前 G[u] 的迭代器末尾。
by metaphysis @ 2021-07-19 19:59:51


[C++ STL容器在循环中删除迭代器的处理细节](https://blog.csdn.net/zymill/article/details/79836586) 建议使用下标的方式倒序遍历,即使删除,也不会影响。
by metaphysis @ 2021-07-19 20:02:35


@[metaphysis](/user/333388) 感谢您的回复!!!!!!!!!!!!!!!!!!![metaphysis](/user/333388)我的英雄
by Martin_MHT @ 2021-07-19 20:10:38


|