从David Abrahams和Aleksey Gurtovoy的书"C++模板元编程“中,我了解到iter_swap
(见下文)有时会比std::swap
慢得多。虽然这本书有一些解释,但我不太明白,有人能更详细地解释一下背后的原因吗?
template <typename ForwardIt1>
void iter_swap(ForwardIt1 it1, ForwardIt1 it2){
typedef typename std::iterator_traits<ForwardIt1>::value_type T;
T tmp = *it1;
*it1 = *it2;
*it2 = tmp;
}
template <typename ForwardIt1>
void swap_wrapper(ForwardIt1 it1, ForwardIt1 it2){
std::swap(*it1, *it2);
}
通过在std::list<std::vector<std::string>>::iterator
上应用它们,我发现第一种方法比第二种方法慢10倍,即使向量的大小(其元素都是小字符串,长度小于10)也只有10倍。
发布于 2019-02-21 01:07:14
您的iter_swap()
通常是次优的,如果它“工作”的话,而且不是完全错误的。
std::iter_swap()
使用argument-dependent-lookup委托swap()
是有原因的:选择定制的implementations.
std::swap()
在交换时利用移动语义,潜在地消除了您不使用的昂贵的资源获取。当然,这两个都与琐碎的类型无关。
发布于 2019-02-21 01:28:27
向量的std::swap
是一个恒定的复杂度运算。
复制向量的复杂度与向量的长度成线性关系。
T tmp = *it1
调用复制构造函数。*it1 = *it2
和*it2 = tmp
调用复制赋值运算符。
https://stackoverflow.com/questions/54791753
复制相似问题