<algorithms>操作有迭代器失效规则吗?

问题描述 投票:0回答:2

例如,在C++20向量中我们有erase和erase_if。它们的效果分别根据remove和remove_if定义(对于擦除[vector.erasure/1]):

效果:相当于:

auto it = remove(c.begin(), c.end(), value);

auto r = distance(it, c.end());

c.erase(it, c.end());

return r;

相关条款(可能)是[container.reqmts/67](括号是我的)

除非另有指定(显式地或通过根据其他函数定义函数),调用容器成员函数或将容器作为参数传递给库函数不应使迭代器无效或更改对象的值在那个容器内。

但是我在中找不到任何关于迭代器的指定操作,包括remove/remove_if。

c++ stl iterator language-lawyer c++20
2个回答
3
投票

算法不能使迭代器失效,因为它们没有能力调整容器的大小。他们所能做的就是给其他对象赋值。 (这就是为什么

remove
remove_if
只完成了一半的工作。)

某些算法可以使对象“无效”,即使它们处于移出状态或未指定的状态,但从容器术语来看,这些算法并不是“无效”的。存储和物品仍然在原来的位置。只是数值发生了变化。


0
投票

单独的迭代器无法使自身或其他迭代器无效,您需要对容器的引用。这就是为什么您引用的部分仅涉及让容器通过的函数。

© www.soinside.com 2019 - 2024. All rights reserved.