gpt4 book ai didi

c++ - 如果传递空范围,vector::erase() 返回什么迭代器?

转载 作者:行者123 更新时间:2023-12-01 12:28:45 24 4
gpt4 key购买 nike

根据 cppreference.comcplusplus.com ,函数std::erase(first, last)返回“最后一个删除元素之后的迭代器”。

但是,在完全没有被移除元素的特殊情况下,即first == last时,返回值是什么不清楚。 (空范围)。截至 2020 年 1 月 19 日,上述消息来源均未提及此特殊情况。

例如,在以下代码中:

std::vector<int> v{1, 2, 3, 4};
auto it1 = v.erase(v.begin(), v.begin());
auto it2 = v.erase(v.end(), v.end());
it1 的值是多少和 it2 ?

最佳答案

这是在 [sequence.reqmts] 中指定的:

The iterator returned by a.erase(q1, q2) points to the element pointed to by q2 prior to any elements being erased. If no such element exists, a.end() is returned.



(注意:我链接了 C++17 最终工作草案,但这种措辞至少从 C++98 开始就存在,请参阅@Peter 的评论)

所以我们应该有 it1 == v.begin()it2 == v.end() .

Live test :
#include <iostream>
#include <vector>

int main()
{
std::vector<int> v{1, 2, 3, 4};
auto it1 = v.erase(v.begin(), v.begin());
auto it2 = v.erase(v.end(), v.end());
std::cout << std::distance(v.begin(), it1) << std::endl;
std::cout << std::distance(v.begin(), it2) << std::endl;
}

输出:
0
4

为了澄清这种行为,我更新了 cppreference文档,现在是:

iterator erase( const_iterator pos );
iterator erase( const_iterator first, const_iterator last );

Return Value

Iterator following the last removed element.

If pos refers to the last element, then the end() iterator is returned.

If last==end() prior to removal, then the updated end() iterator is returned.

If [first, last) is an empty range, then last is returned.

关于c++ - 如果传递空范围,vector::erase() 返回什么迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59815116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com