簡體   English   中英

std :: reverse with反向迭代器,為什么不執行no-op?

[英]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() )時發生的情況:

  • ae交換。 該字符串現在為ebcda
  • bd交換。 該字符串現在為edcba

現在,反轉完成了( c位於中間,不需要移動)。

現在考慮回退時(從s.rbegin()s.rend() )會發生什么:

  • e為換 該字符串現在為ebcda
  • db交換。 該字符串現在為edcba

最終結果是相同的,因為交換是對稱的。

根據C ++標准:

25.3.10反向 [alg.reverse]

 template<class BidirectionalIterator> void reverse(BidirectionalIterator first, BidirectionalIterator last); 

效果:對於每個i < (last - first) / 2非負整數,將iter_swapfirst + 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM