繁体   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