container.erase(first,last),其中first == last在STL容器中
container.erase(first,last) where first == last in STL containers
当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()
。
概念上有一个从begin
到end
的普通循环,有一个简单的循环条件来检查迭代器是否已经是end
,如下所示:
void erase (iterator from, iterator to) {
...
while (from != to) erase (from++);
...
}
(然而,实现可能有所不同)。如您所见,如果是from==to
,则没有循环体的单次迭代。
完美定义。它删除从first
到last
的所有元素,包括first
,不包括last
。如果没有元素在这个范围内(当first == last
),那么有多少被删除?你猜对了,没有。
虽然我不确定如果first
在last
之后会发生什么,我想这将调用未定义的行为。
- C++算法标头中,为什么要使用 "!(val < *first)" ?
- 迭代嵌套映射与范围为循环:没有名为"first"的成员
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- std::adjacent_find(last, last) 是未定义的吗?
- 如何理解"Temporary objs are destroyed as the last step in evaluating the full-expression"?谁能用一些简单的例子来说明这
- 为什么Eigen不能解析内置符号?(all、last、seq等)
- 为什么 std::d istance() 对于 std:list:<int>:itrator 在 last 在 first 之前时不返回负数?
- c std :: vector迭代器构造函数,first == last
- QSqlQuery last 不起作用
- 如何声明pair<int,int>::first
- 自动,错误:MAP ITERATOR没有名为“ First”的成员
- "Node<T*> *first"和"Node<T> *first"有什么区别?
- 如何从unordered_set获取"last"元素?
- 为什么 std::find_if(first, last, p) 不通过引用获取谓词?
- 我怎样才能保持'first'和'second'用结构替换 std::p air?
- 为什么"begin/end"与"first/last"的差异?
- 自定义迭代器中distance_type的目的 - std::d istance(first, last) 将返回错误的
- 创建一个算法,要求用户输入两个正数,将它们称为 "first" 和 "last" ,并打印第一个正数之间的所有数字的总和
- container.erase(first,last),其中first == last在STL容器中
- 如何使用一对迭代器[first, last]在模板中创建容器