C++ 为什么在反向STL实现中需要交换?加速C++;(问题8.4)

C++ 为什么在反向STL实现中需要交换?加速C++;(问题8.4),c++,stl,accelerated-c++,C++,Stl,Accelerated C++,我试图回答这个问题: 在反向功能的实现中,为什么我们调用swap而不是交换*first和*last的值?以下是反向功能: template <class BiDirectionalIterator> void reverse(BiDirectionalIterator first, BiDirectionalIterator last) { while(first < last) { --last; if(first != last) {

我试图回答这个问题: 在反向功能的实现中,为什么我们调用swap而不是交换
*first
*last
的值?以下是反向功能:

template <class BiDirectionalIterator>
void reverse(BiDirectionalIterator first, BiDirectionalIterator last)
{
    while(first < last) {
        --last;
        if(first != last) {
            swap(*first++, *last);
        }
    }
}

我看到这不起作用。然后我尝试
bitmp=*first
获取
first
的值,但得到了一个编译器错误。除了调用
swap
函数之外,没有其他方法可以做到这一点吗?我正在寻找在函数本身中执行此操作的方法。

您需要先将值
*存储为临时存储,而不是先存储迭代器

auto tmp = *first;
*first = *last;
*last = tmp;
first++;
否则,您将覆盖
*first
,而不存储其以前的值,因此您基本上只是从
*last
复制到
*first
(然后再次冗余复制),而不是交换

执行此操作时出错的原因:

Bi tmp = *first
因为
Bi
是迭代器的类型,而不是您试图交换的值的类型。要获得正确的类型,您可以像上面那样使用
auto
,也可以更明确地使用:

typename std::iterator_traits<Bi>::value_type tmp = *first;
typename std::iterator\u traits::value\u type tmp=*first;
typename std::iterator_traits<Bi>::value_type tmp = *first;