This question already has answers here:
How to call erase with a reverse iterator

(12个答案)


1年前关闭。




我正在尝试解决C++中的问题,其中一部分需要我使用rbegin()成员函数从 vector 中删除元素。但是,每次我写下面提到的代码时,编译器都会引发错误。怎么了
int main() {

    int a = 1, b = 2;

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

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

    return 0;
}

c&#43;&#43; - 从 vector 中删除元素– rbegin()vs begin()-LMLPHP

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

    int a = 1, b = 2;

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

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

    return 0;
}

最佳答案

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

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

该代码可以编译,但是会导致未定义的行为,因为iteratorrbegin()对应于end()。从 std::vector::erase() 文档中:
iterator erase(const_iterator pos);


rbegin().base()返回end(),而不是end() - 1。不过,如果您想要一个可取消引用的迭代器,则可以将rbegin()推进1:
auto it = (std::next(rit)).base();

关于c++ - 从 vector 中删除元素– rbegin()vs begin(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59201434/

10-16 04:41