c++ - 从 vector 中删除元素 – rbegin() 与 begin()

标签 c++ vector iterator erase reverse-iterator

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

int main() {

    int a = 1, b = 2;

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

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

    return 0;
}

ERROR:

但是,如果我使用 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 的重载。但是,您可以通过调用 reverse_iteratorbase() 成员函数来获取相应的 iterator:

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

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

iterator erase(const_iterator pos);

The iterator pos must be valid and dereferenceable. Thus the end() iterator (which is valid, but is not dereferencable) cannot be used as a value for pos.

<小时/>

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

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

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

相关文章:

c++ - 在工厂模式中自动注册派生类

c++ - 是否有交换 C++ vector 中的两个段的函数?

android - 如何在 Android 中将 <vector> 放入 <shape> 中?

c++如何删除二维 vector 中的任何空元素

c++ - 迭代器列表

iOS应用程序中的C++算法

c++ - 基本c++语法的确认

python:如何在固定缓冲区类中切片/存储 iter 指向的数据?

c++ - 过滤器列表 - C++

c++ - 如何将三角孔补丁转换为表面网格?