参考/价值混淆的麻烦?

时间:2012-10-28 02:26:57

标签: c++ iterator

我正在调整一个函数来反转由迭代器begin和end表示的容器的值。

为什么这样做:

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。 我不明白这种行为,这里有什么不对?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

问题在于:

Bi temp = begin;
Bi temp2 = end;

第一行指定迭代器位置begin指向temp。所以现在temp引用容器中与begin相同的位置。

然后修改存储在该位置的

*begin = *temp2;

当然,temp仍然引用该位置,因此*temp现在也代表修改后的值。

因此,这个:

*end = *temp;

将错误的值分配给*end(事实上,它根本不会分配任何新值)。