C++ 参考值/值混淆问题?

C++ 参考值/值混淆问题?,c++,iterator,C++,Iterator,我正在调整一个函数,它反转由迭代器begin和end表示的容器的值 为什么这样做有效: template<class Bi> void reverse(Bi begin, Bi end){ while (begin!= end) { --end; if (begin != end) swap(*begin++, *end); } } 模板无效反转(双开始,双结束){ while(开始!=结束){ --结束; 如

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

为什么这样做有效:

template<class Bi> void reverse(Bi begin, Bi end){
    while (begin!= end) {
        --end;
        if (begin != end)
            swap(*begin++, *end);
    }
}
模板无效反转(双开始,双结束){
while(开始!=结束){
--结束;
如果(开始!=结束)
交换(*开始++,*结束);
}
}
但不是这个

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++;
        }
    }
}
模板无效反转(双开始,双结束){
while(开始!=结束){
--结束;
如果(开始!=结束){
Bi temp=开始;
Bi temp2=结束;
*begin=*temp2;
*结束=*温度;
begin++;
}
}
}
这可以很好地编译,但我一定是误解了迭代器之间的赋值相等,因为当我反转一个向量,比如值1到5时,第一个向量的值是5到1,而第二个向量的值是5,4,3,4,5。
我不理解这种行为,这里出了什么问题?

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


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

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

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

问题在于:

Bi temp = begin;
Bi temp2 = end;
第一行指定迭代器位置
begin
指的是
temp
。因此,现在
temp
引用容器中与
begin
相同的位置

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

*begin = *temp2;
当然,
temp
仍然引用该位置,因此
*temp
现在也表示修改后的值

因此,这:

*end = *temp;
将错误的值分配给
*end
(实际上,它根本没有分配任何新值)。

问题在于:

Bi temp = begin;
Bi temp2 = end;
第一行指定迭代器位置
begin
指的是
temp
。因此,现在
temp
引用容器中与
begin
相同的位置

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

*begin = *temp2;
当然,
temp
仍然引用该位置,因此
*temp
现在也表示修改后的值

因此,这:

*end = *temp;

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

顺便说一句,你可能想使用。@KerrekSB:如果你想建议预构建的解决方案,你可以全力以赴,建议
std::reverse
,而不是自己滚动。:)顺便说一句,你可能想使用。@KerrekSB:如果你想建议预建解决方案,你可以全力以赴,建议
std::reverse
,而不是自己滚动。:)谢谢你的帮助,我知道我忘了什么@感谢你的帮助,我知道我忘记了这样的事情@乔加潘