1

我正在调整一个函数,它反转由迭代器开始和结束表示的容器的值。

为什么会这样:

template<class Bi> void reverse(Bi begin, Bi end){
    while (begin!= end) {
        --end;
        if (begin != end)
            swap(*begin++, *end);
    }
}

但不是这个?

template<class Bi> void reverse(Bi begin, Bi end){
    while (begin != end) {
        --end;
        if (begin != end){
            Bi temp = begin;
            Bi temp2 = end;
            *begin = *temp2;
            *end = *temp;
            begin++;
        }
    }
}

这编译得很好,但我一定误解了一些关于分配相互相等的迭代器的事情,因为当我去反转一个向量时,比如说,值 1 到 5,我最终在第一个中得到 5 到 1,但是第二个产生值 5、4、3、4、5。我不明白这种行为,这里有什么问题?

4

2 回答 2

4

您正在混合迭代器和值的概念。在第二种方法中,您复制迭代器,但不复制值:begintemp引用相同的元素,endand 也是如此temp2。当您*begin = *temp2;将第一个元素设置为 5 时,当您稍后*end=*temp将第一个元素(已经设置为 5)复制到最后一个位置时,将第一个和最后一个位置都保留为5.

您需要做的是复制,而不是迭代器。

于 2012-10-28T02:34:52.383 回答
2

问题在这里:

Bi temp = begin;
Bi temp2 = end;

第一行指定迭代器位置begin是指temp。所以现在temp指的是容器中与begin.

然后修改存储在该位置的值:

*begin = *temp2;

当然,temp还是指那个位置,所以*temp现在也代表修改后的值。

因此,这:

*end = *temp;

分配了错误的值*end(事实上,它根本没有分配任何新值)。

于 2012-10-28T02:35:26.657 回答