C++ 为什么在反向STL实现中需要交换?加速C++;(问题8.4)
我试图回答这个问题: 在反向功能的实现中,为什么我们调用swap而不是交换C++ 为什么在反向STL实现中需要交换?加速C++;(问题8.4),c++,stl,accelerated-c++,C++,Stl,Accelerated C++,我试图回答这个问题: 在反向功能的实现中,为什么我们调用swap而不是交换*first和*last的值?以下是反向功能: template <class BiDirectionalIterator> void reverse(BiDirectionalIterator first, BiDirectionalIterator last) { while(first < last) { --last; if(first != last) {
*first
和*last
的值?以下是反向功能:
template <class BiDirectionalIterator>
void reverse(BiDirectionalIterator first, BiDirectionalIterator last)
{
while(first < last) {
--last;
if(first != last) {
swap(*first++, *last);
}
}
}
我看到这不起作用。然后我尝试
bitmp=*first
获取first
的值,但得到了一个编译器错误。除了调用swap
函数之外,没有其他方法可以做到这一点吗?我正在寻找在函数本身中执行此操作的方法。您需要先将值*存储为临时存储,而不是先存储迭代器
auto tmp = *first;
*first = *last;
*last = tmp;
first++;
否则,您将覆盖*first
,而不存储其以前的值,因此您基本上只是从*last
复制到*first
(然后再次冗余复制),而不是交换
执行此操作时出错的原因:
Bi tmp = *first
因为Bi
是迭代器的类型,而不是您试图交换的值的类型。要获得正确的类型,您可以像上面那样使用auto
,也可以更明确地使用:
typename std::iterator_traits<Bi>::value_type tmp = *first;
typename std::iterator\u traits::value\u type tmp=*first;
typename std::iterator_traits<Bi>::value_type tmp = *first;