从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倍。
答案 0 :(得分:6)
如果您的iter_swap()
完全“起作用”,通常就不是最佳选择,而且并非毫无疑问。
std::iter_swap()
使用argument-dependent-lookup委托给swap()
的原因是:
选择量身定制的实现。
此外,后备std::swap()
在交换时利用了移动语义,可以消除您没有使用的昂贵的资源获取。
当然,两者对于琐碎的类型都是无关的。
答案 1 :(得分:2)
std::swap
是常数复杂度运算。
复制向量的复杂度与向量的长度成线性关系。
T tmp = *it1
调用复制构造函数。 *it1 = *it2
和*it2 = tmp
调用副本分配运算符。