[英]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.