This question already has answers here:
How to call erase with a reverse iterator
(12个答案)
1年前关闭。
我正在尝试解决C++中的问题,其中一部分需要我使用
但是,如果我使用
该代码可以编译,但是会导致未定义的行为,因为
(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;
}
但是,如果我使用
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);
该代码可以编译,但是会导致未定义的行为,因为
iterator
的rbegin()
对应于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