在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?
如果有标准库规范文档包含此信息,我将不胜感激。
答案 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)
完美定义。它会删除first
到last
的所有元素,包括first
和last
。如果此范围内没有元素(first == last
时),那么删除了多少?你猜对了,没有。
虽然我不确定如果first
位于last
之后会发生什么,我想这会调用未定义的行为。
答案 3 :(得分:1)
概念,有一个从begin
到end
的普通循环,有一个简单的循环条件,检查迭代器是否已经end
,就像这样:
void erase (iterator from, iterator to) {
...
while (from != to) erase (from++);
...
}
(但实施可能会有所不同)。如您所见,如果from==to
,则循环体没有单一迭代。