container.erase(first,last),其中first == last在STL容器中

container.erase(first,last) where first == last in STL containers

本文关键字:last first STL erase container 其中      更新时间:2023-10-16

当STL中的first == last时,是否有定义的container.erase(first,last)行为,或者它未定义?

的例子:

std::vector<int> v(1,1);
v.erase(v.begin(),v.begin());
std::cout << v.size(); // 1 or 0?

如果有一个标准库规范文档有这些信息,我将非常感谢它的参考

行为定义良好。

是No-op(No-Operation)。由于end和begin相同,因此不会对容器执行任何擦除操作。

标准中的相关报价如下:

c++ 03标准:24.1迭代器要求
c++ 11标准:24.2.1迭代器要求

7 for both:

当且仅当表达式++i的有限应用序列使得i == j时,迭代器j被称为可访问迭代器i,如果j可从i访问,则它们指向同一个容器。

标准库中操作数据结构的大多数算法模板都有使用range的接口。范围是一对迭代器,用于指定计算的开始和结束。range [i, i)是一个空的range;一般来说,range [i, j)是指数据结构中的元素,从i指向的元素开始,直到但不包括j指向的元素。当且仅当j可以从i到达时,range [i, j)是有效的。将标准库中的函数应用于无效范围的结果是未定义的。

这将完全不擦除任何内容,就像其他操作[, )范围的算法一样。

即使容器是空的,我认为这仍然会工作,因为begin() == end()

概念上有一个从beginend的普通循环,有一个简单的循环条件来检查迭代器是否已经是end,如下所示:

void erase (iterator from, iterator to) {
    ...
    while (from != to) erase (from++);
    ...
}

(然而,实现可能有所不同)。如您所见,如果是from==to,则没有循环体的单次迭代。

完美定义。它删除从firstlast的所有元素,包括first,不包括last。如果没有元素在这个范围内(当first == last),那么有多少被删除?你猜对了,没有。

虽然我不确定如果firstlast之后会发生什么,我想这将调用未定义的行为。