9

我正在尝试解决 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;
}
4

1 回答 1

9

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

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

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

iterator erase(const_iterator pos);

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


rbegin().base()回报end(),不是end() - 1rbegin()不过,如果你想要一个可取消引用的迭代器,你可以前进一个:

auto it = (std::next(rit)).base();
于 2019-12-05T18:54:57.603 回答