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

时间:2011-10-13 15:41:19

标签: c++ stl

在STL中第一个== last时,是否存在container.erase(first,last)的定义行为,还是未定义?

示例:

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

如果有标准库规范文档包含此信息,我将不胜感激。

4 个答案:

答案 0 :(得分:5)

行为定义明确。

这是一个无操作(无操作)。它不对容器执行任何擦除操作,因为end与begin相同。

标准的相关报价如下:

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

Para 6&amp; 7 两者:

  

迭代器j被称为可以从迭代器i到达,当且仅当存在表达式++ i的有限序列的应用程序时才使得i == j。如果j可以从i访问,则它们引用相同的容器。

     

在数据结构上运行的大多数库的算法模板都有使用range的接口。范围是一对指定计算开始和结束的迭代器。范围[i,i]是空范围;通常,范围[i,j]是指数据结构中的元素,从i指向的那个开始,直到但不包括j指向的元素。当且仅当j可从i到达时,Range [i,j]才有效。将函数库中的函数应用于无效范围的结果是未定义的。

答案 1 :(得分:4)

这将完全删除任何内容,就像在[, )范围内运行的其他算法一样。

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

答案 2 :(得分:1)

完美定义。它会删除firstlast的所有元素,包括firstlast。如果此范围内没有元素(first == last时),那么删除了多少?你猜对了,没有。

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

答案 3 :(得分:1)

概念,有一个从beginend的普通循环,有一个简单的循环条件,检查迭代器是否已经end,就像这样:

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

(但实施可能会有所不同)。如您所见,如果from==to,则循环体没有单一迭代。