[英]std::reverse with reverse iterators, why isn't it a no-op?
举个最小的例子:
#include <iostream>
#include <string>
#include <algorithm>
int main()
{
std::string s{"abcde"};
std::reverse(s.rbegin(), s.rend());
std::cout << s;
}
由于我们要反转一系列反向迭代器,因此我希望它不会出现。 但是它会打印edcba
。 我对反向迭代器或std::reverse
不了解?
算法在范围上运行。 std::reverse
完成了它的工作,现在[ s.rbegin()
, s.rend()
)是"abcde"
。 std::cout << s;
将从另一端打印它,所以为"edcba"
。
在这种情况下,交换操作是对称的,因此从s.begin()
到s.end()
还是从s.rbegin()
到s.rend()
。
为了直观地看到这一点,首先使用您的abcde示例考虑前进(从s.begin()
到s.end()
)时发生的情况:
现在,反转完成了( c位于中间,不需要移动)。
现在考虑回退时(从s.rbegin()
到s.rend()
)会发生什么:
最终结果是相同的,因为交换是对称的。
根据C ++标准:
25.3.10反向 [alg.reverse]
template<class BidirectionalIterator> void reverse(BidirectionalIterator first, BidirectionalIterator last);
效果:对于每个
i < (last - first) / 2
非负整数,将iter_swap
到first + i
(last - i) - 1
所有迭代器对。
没关系,
最后它使用swap(* _ Left,* _Right); 因此它更改了原始字符串s
参见来源:
template<class _BidIt> inline
void reverse(_BidIt _First, _BidIt _Last)
{ // reverse elements in [_First, _Last)
_DEBUG_RANGE(_First, _Last);
_Reverse(_Unchecked(_First), _Unchecked(_Last), _Iter_cat(_First));
}
template<class _BidIt> inline
void _Reverse(_BidIt _First, _BidIt _Last, bidirectional_iterator_tag)
{ // reverse elements in [_First, _Last), bidirectional iterators
for (; _First != _Last && _First != --_Last; ++_First)
_STD iter_swap(_First, _Last);
}
template<class _FwdIt1,
class _FwdIt2> inline
void iter_swap(_FwdIt1 _Left, _FwdIt2 _Right)
{ // swap *_Left and *_Right
swap(*_Left, *_Right);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.