C++ 参考值/值混淆问题?
我正在调整一个函数,它反转由迭代器begin和end表示的容器的值 为什么这样做有效: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(开始!=结束){ --结束; 如
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
,而不是自己滚动。:)谢谢你的帮助,我知道我忘了什么@感谢你的帮助,我知道我忘记了这样的事情@乔加潘