2016-06-02 6 views
-1

は、この最小限の例を見てみましょう:std :: reverseはリバースイテレータで、なぜノーオペレーションではないのですか?

#include <iostream> 
#include <string> 
#include <algorithm> 

int main() 
{ 
    std::string s{"abcde"}; 
    std::reverse(s.rbegin(), s.rend()); 
    std::cout << s; 
} 

我々はリバースイテレータの範囲を逆にしているので、私はそれが組合ならないことを期待しています。しかし、それはedcbaを印刷します。リバースイテレータやstd::reverseについて私が理解できないことはありますか?

+0

[ "STDを適用するかのように最初、最後) 振る舞う::最初のイテレータのすべてのペアにiter_swap + I、(最後-I)の範囲内の要素の順序を逆に - 各非ための1負の数値を否定することは期待できますか?(負のi <(ラストファースト)/ 2 ")(http://en.cppreference.com/w/cpp/algorithm/reverse) –

+0

あなたはまた、帰りの旅でUターンをノーオペにすることを期待していますか?そうでない場合は、どうしてですか? –

+0

誰かがUターンを2回期待しているかもしれません。または、より正確には、後方に座ってUターンを行う;) –

答えて

1

アルゴリズムは範囲で動作します。 std::reverseは仕事をしており[s.rbegin()s.rend())は"abcde"になりました。 std::cout << s;は反対側から印刷しますので、"edcba"

0

最後にスワップ(* _ 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); 
    } 
1

を、あなたがs.begin()からs.end()またはs.rbegin()からs.rend()に行くかどうかは関係ありませんので、スワップ操作は、対称的です。

は最初 ABCDE のあなたの例を使用して、(s.begin()からs.end()に)前方に行くときに何が起こるかを検討し、これを視覚化するには、次の

  • 電子と交換されます。文字列はebcdaになりました。
  • bは、dと交換されます。文字列は、edcbaになりました。

反転が完了しました(cは中にあり、移動する必要はありません)。

は今(s.rbegin()からs.rend()に)逆方向に行くときに何が起こるかを考えてみます。

  • 電子と交換されます。文字列はebcdaになりました。
  • dは、bと交換されます。文字列は、edcbaになりました。

スワップが対称であるため、最終結果は同じです。 C++標準によれば

25.3.10リバース [ALG。]

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

効果を逆転:を各非負整数i < (last - first)/2ため、イテレータfirst + i(last - i) - 1のすべてのペアにiter_swapを適用します。

関連する問題