我正在调整一个函数来反转由迭代器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。 我不明白这种行为,这里有什么不对?
答案 0 :(得分:4)
您正在混合迭代器的概念和值。在第二种方法中,您复制迭代器,但不复制值:begin
和temp
引用相同的元素,因此请end
和temp2
。当您执行*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
(事实上,它根本不会分配任何新值)。