为什么天真的“ iter_swap”比“ swap”要慢得多?

时间:2019-02-20 17:03:31

标签: c++ c++11 iterator metaprogramming swap

从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倍。

2 个答案:

答案 0 :(得分:6)

如果您的iter_swap()完全“起作用”,通常就不是最佳选择,而且并非毫无疑问。

  1. std::iter_swap()使用委托给swap()的原因是:
    选择量身定制的实现。

  2. 此外,后备std::swap()在交换时利用了移动语义,可以消除您没有使用的昂贵的资源获取。

当然,两者对于琐碎的类型都是无关的。

答案 1 :(得分:2)

向量的

std::swap是常数复杂度运算。

复制向量的复杂度与向量的长度成线性关系。

T tmp = *it1调用复制构造函数。 *it1 = *it2*it2 = tmp调用副本分配运算符。