从向量中删除元素——rbegin() vs begin()
Erasing element from a vector – rbegin() vs begin()
我正在尝试解决 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;
}
reverse_iterator
没有 std::vector::erase()
重载。但是,您可以通过调用其 base()
成员函数从 reverse_iterator
中获取相应的 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()
returnsend()
,不是end() - 1
。不过,如果你想要一个可取消引用的迭代器,你可以将 rbegin()
提前一个:
auto it = (std::next(rit)).base();
我正在尝试解决 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;
}
reverse_iterator
没有 std::vector::erase()
重载。但是,您可以通过调用其 base()
成员函数从 reverse_iterator
中获取相应的 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 theend()
iterator (which is valid, but is not dereferencable) cannot be used as a value forpos
.
rbegin().base()
returnsend()
,不是end() - 1
。不过,如果你想要一个可取消引用的迭代器,你可以将 rbegin()
提前一个:
auto it = (std::next(rit)).base();