Vio*_*ffe 8 c++ containers erase
我刚写了下面的代码,并且很惊讶它不编译:
std::deque<int> container;
// filling the container...
for (auto it = container.rbegin(); it != container.rend(); ++it)
if (*it == 5)
{
container.erase(it);
break;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我想删除符合特定条件的最后一个元素(如果有).
错误是
调用std :: deque :: erase没有匹配函数(std :: reverse_iterator ...
起初我不相信它是由反向迭代器引起的,但事实确实如此,因为替换rbegin/ rend使用begin/ end解决它.
那么,2个问题:
我无法回答“为什么”问题,但要回答“如何” - 您应该调用base()迭代器。它将返回一个正确的前向迭代器。
这样做时,请记住反向迭代器和正向迭代器之间的关系。一开始可能会令人困惑,但实际上非常简单。如果您有std::vector包含以下物品:
1, 2, 3, 4, 5
Run Code Online (Sandbox Code Playgroud)
你有一个reverse_iteratorrit,在解引用时它给你 3,然后*(rit.base)将等于 4。要了解为什么,只需记住在普通迭代器中begin()是可解引用的,但end()不是。在反向迭代器中,属性必须相同 -rbegin()必须是可解除引用的,但rend()不应该 - 即应该指向容器开头之外。
因为根据定义,rend.base()与begin()(因为 rend 可以构造为reverse_iterator(begin()),以上所有内容可以成立的唯一方法是 ifrend.base()会将下一个右侧元素返回到开头之外的元素 - begin()。很容易看出,相同对称性成立rend()。