为什么不擦除支持反向迭代器?

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个问题:

  1. 为什么不支持这个?它只是C++委员会忘记包含在标准中的那些小事之一,还是缺少这种过载的理由?
  2. 做我想要的最优雅的方式是什么?我是否坚持按索引迭代?

Ser*_*eyA 0

我无法回答“为什么”问题,但要回答“如何” - 您应该调用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()