0

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

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

我想在这里澄清我的理解。*first我尝试直接交换*last

template <class Bi>
void incorrect_reverse(Bi first, Bi last)
{
    while(first < last) {
        --last;
        if(first != last) {
            //here tmp and first both point to the same thing
            Bi tmp = first;
            *first = *last;
            *last = *tmp;
            first++;
        }
    }
}

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

4

1 回答 1

2

您需要将值存储*first为临时存储,而不是 iterator first

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;
于 2015-10-07T01:35:33.793 回答