Red*_*met 8 c++ iterator vector erase reverse-iterator
我正在尝试解决 C++ 中的一个问题,其中一部分要求我使用rbegin()成员函数从向量中删除元素。但是,每次我编写下面提到的代码时,编译器都会抛出错误。这里有什么问题?
int main() {
int a = 1, b = 2;
vector<int> V = {a, b};
auto it = V.rbegin();
V.erase(it);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用begin()成员函数访问相同的元素,它编译得很好。下面的代码工作正常。
int main() {
int a = 1, b = 2;
vector<int> V = {a, b};
auto it = V.begin()+1;
V.erase(it);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
没有std::vector::erase()过载reverse_iterator。但是,您可以通过调用其成员函数iterator从 a 中获取相应的:reverse_iteratorbase()
auto rit = V.rbegin();
auto it = rit.base();
V.erase(it);
Run Code Online (Sandbox Code Playgroud)
此代码编译,但会导致不确定的行为,因为iterator对口rbegin()对应end()。从std::vector::erase()文档:
iterator erase(const_iterator pos);
Run Code Online (Sandbox Code Playgroud)
迭代器
pos必须有效且可取消引用。因此所述end()迭代器(其是有效的,但不是dereferencable)不能被用作一个值pos。
rbegin().base()返回end(),不是end() - 1。不过,rbegin()如果你想要一个可取消引用的迭代器,你可以前进一个:
auto it = (std::next(rit)).base();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
364 次 |
| 最近记录: |