从向量中删除元素 - rbegin() vs begin()

11

我正在尝试解决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
你收到了什么错误?它应该立即解释问题。具体来说,我不认为有一个接受reverse_iteratorvector::erase重载函数-只有一个接受iterator的。 - user11923373
1
请看这里。你会发现自C++11以来,erase仅接受const_iterator - ChrisMM
1
这个回答解决了你的问题吗?如何使用反向迭代器调用erase函数 - Lukas-T
感谢Churill。我之前不知道这些东西。 - RedHelmet
1个回答

11

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

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

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

iterator erase(const_iterator pos);

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


rbegin().base()返回end()而不是end() - 1。尽管如此,如果您想要一个可解引用的迭代器,可以将rbegin()向前移动一个位置:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接