std::remove是否保留被移除元素?end_it至v.end()行为是否明确?
关于std::remove的两个问题解答
先看你的测试代码,核心是对std::remove的逻辑理解有误:它的作用不是把要移除的元素移到末尾,而是把需要保留的元素往前移动,覆盖掉要移除元素的位置。你的代码里,vector初始有10个false,前两个设为true,调用remove后,后面的false会依次往前覆盖前两个true的位置,所以整个vector遍历出来全是false。
针对你的两个问题:
std::remove是会保留被移除的元素还是可能将其覆盖?
不会保留被移除的元素,它会用后续需要保留的元素覆盖掉被移除元素的位置。被移除元素的原始位置会被覆盖,最终这些元素的内容是未定义的,不要试图访问或依赖它们。end_it到v.end()之间的元素行为是否属于定义好的行为?
不属于。C++标准只保证[v.begin(), end_it)区间内的元素是符合保留条件的、顺序和原容器中出现顺序一致的元素;而[end_it, v.end())区间内的元素值是未指定的,可能是原容器的旧值,也可能被覆盖成其他内容,完全不能依赖这部分元素的状态。
补充:如果想要真正删除这些元素,需要配合容器的erase方法,也就是
v.erase(end_it, v.end()),这样容器的size会缩小,剩下的都是需要保留的元素。
内容的提问来源于stack exchange,提问作者24n8
相关产品推荐
相关产品推荐

