![]() |
1
18
显然,解决方案是base()返回的值为1。以下标识适用于reverse_iterator:
或者换句话说,reverse_iterator始终是它所基于的常规迭代器的一次传递。不知道为什么。 在GCC中只需更改
向
不过,我确实很好奇为什么上面的身份是有意义的。 在Visual Studio中回到工作中,在visualstudio中尝试一下,我发现上面的解决方案不太奏效。“nextIter”在擦除时无效。相反,您需要从擦除中保存临时值以获取下一个迭代器,而不是像上面那样保留一个nextIter。
所以最终的解决方案是
注意,关联容器不会从擦除返回迭代器。所以这个解决方案不适用于map、multimap等。 |
![]() |
2
3
当您使用反向迭代器迭代并希望使用base()修改其容器时,请始终记住,reverse_iterator始终基于原始顺序的下一个迭代器。这有点不直观,但它实际上使代码更简单:
在这个例子中,不需要保留“下一个”迭代器,因为基本迭代器没有失效!(在处理普通迭代器时,我们确实需要它。) 反向迭代器的行为在处理单个项目时会造成奇怪的逐一困难,但事实上它简化了范围:
使用与以下对象完全相同的对象(顺序相反)
|
![]() |
3
0
1从
map::erase
我们知道这只需要
2从
reverse_iterator::base
,我们知道
因此,您可以擦除(--r_v.base())来擦除“r_v”(和“current-1”)指向的元素:
|
![]() |
4
-3
呼叫
此外,您不需要单独的“下一个”迭代器(见上面的更改)。更好的方法是使用
|
![]() |
AstralHex · 矩阵乘法代码工作不正常 7 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 8 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 8 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 8 月前 |