std :: sort如何仅使用迭代器实现交换操作?

时间:2012-04-11 14:10:32

标签: c++ algorithm stl

我如何实施以下

template <typename ITERATOR> void Swap (ITERATOR a, ITERATOR b) {
  ...
}

以便交换(a,b)交换a和b指向的值。 换句话说:如何在不知道数据类型的情况下创建第三个变量?

5 个答案:

答案 0 :(得分:7)

这项工作只有iter_swap

std::iter_swap(a, b);

此外,如果您可以使用c ++ 11,则可以使用decltype

std::remove_reference<decltype(*a)>::type c = *a;
*a = *b;
*b = c;

答案 1 :(得分:6)

  

如何在不知道数据类型的情况下创建第三个变量?

使用std::iterator_traits<ITERATOR>::value_type

答案 2 :(得分:4)

在C ++ 11中,类型为std::remove_reference<decltype(*a)>::type,但是为了声明变量,您可以使用auto

在C ++ 03中,推断任意表达式类型的最可靠方法是通过另一个模板:

// NOTE: This is for illustration only. If you are simply swapping
// values, use 'std::swap' instead of this, since that is specialised
// for many types to avoid unnecessary copy-assignment.
template <typename T> void value_swap(T & a, T & b) {
    T t = a;
    a = b;
    b = t;
}

template <typename I> void iterator_swap(I a, I b) {
    value_swap(*a, *b);
}

或者,对于行为良好的迭代器(包括指针和标准迭代器),类型可用作std::iterator_traits<ITERATOR>::value_type。如果有人编写了自己的迭代器类型而没有提供默认iterator_traits所需的嵌套类型或者为其专门设置iterator_traits,那么这将无效。

某些编译器提供类似于decltype的非标准扩展名;例如,GCC提供typeof。如果你不需要你的代码可以移植,你可以使用这样的东西。

顺便说一句,您的特定功能已经存在std::iter_swap

答案 3 :(得分:3)

template <typename ITERATOR> void Swap (ITERATOR a, ITERATOR b) {
  using std::swap;
  swap(*a,*b);
}

答案 4 :(得分:2)

迭代器有一个所谓的特性,用于定义它的值类型。

        iterator_traits<ITERATOR>::value_type temp = *a;
        *a = *b;
        *b = temp;