【问题标题】:Erasing element from a vector – rbegin() vs begin() [duplicate]从向量中擦除元素 - rbegin() 与 begin() [重复]
【发布时间】:2020-03-30 18:08:41
【问题描述】:

我正在尝试解决 C++ 中的一个问题,其中一部分需要我使用 rbegin() 成员函数从向量中擦除元素。但是,每次我编写下面提到的代码时,编译器都会抛出一个错误。这里有什么问题?

int main() {

    int a = 1, b = 2;

    vector<int> V = {a, b};

    auto it = V.rbegin();
    V.erase(it);

    return 0;
}

但是,如果我使用 begin() 成员函数访问相同的元素,它编译得很好。下面的代码工作正常。

int main() {

    int a = 1, b = 2;

    vector<int> V = {a, b};

    auto it = V.begin()+1;
    V.erase(it);

    return 0;
}

【问题讨论】:

  • 您收到的错误是什么?它应该立即解释这个问题。具体来说,我不相信有一个接受 reverse_iteratorvector::erase 重载 - 只有一个接受 iterator 的重载。
  • 看看here。你会看到 erase 自 c++11 起只接受 const_iterator
  • 这能回答你的问题吗? How to call erase with a reverse iterator
  • 谢谢丘瑞尔。不知道这个东西

标签: c++ vector iterator erase reverse-iterator


【解决方案1】:

reverse_iterator 没有 std::vector::erase() 过载。但是,您可以通过调用reverse_iteratorbase() 成员函数从reverse_iterator 中获取对应的iterator

auto rit = V.rbegin();
auto it = rit.base();
V.erase(it);

此代码确实可以编译,但会导致未定义的行为,因为 rbegin() 对应的 iterator 对应于 end()。来自std::vector::erase() 文档:

iterator erase(const_iterator pos);

迭代器pos 必须有效且可取消引用。因此end() 迭代器(有效,但不可取消引用)不能用作pos 的值


rbegin().base() 返回end(),而不是end() - 1。不过,如果您想要一个可取消引用的迭代器,您可以将 rbegin() 提前 1 个:

auto it = (std::next(rit)).base();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    相关资源
    最近更新 更多