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

C++ std::sort如何仅使用迭代器实现交换操作?,c++,algorithm,stl,C++,Algorithm,Stl,例如,我如何实现以下内容 template <typename ITERATOR> void Swap (ITERATOR a, ITERATOR b) { ... } 模板无效交换(迭代器a、迭代器b){ ... } 交换(a,b)交换a和b所指向的值。 换句话说:在不知道数据类型的情况下,如何创建第三个变量?迭代器有一个所谓的特性来定义它的值类型 iterator_traits<ITERATOR>::value_type temp = *a;

例如,我如何实现以下内容

template <typename ITERATOR> void Swap (ITERATOR a, ITERATOR b) {
  ...
}
模板无效交换(迭代器a、迭代器b){
...
}
交换(a,b)交换a和b所指向的值。
换句话说:在不知道数据类型的情况下,如何创建第三个变量?

迭代器有一个所谓的特性来定义它的值类型

        iterator_traits<ITERATOR>::value_type temp = *a;
        *a = *b;
        *b = temp; 
iterator\u traits::value\u type temp=*a;
*a=*b;
*b=温度;
仅此项工作有:

std::iter_swap(a, b);
如果您可以使用c++11,也可以使用
decltype

std::remove_reference<decltype(*a)>::type c = *a;
*a = *b;
*b = c;
std::remove_reference::type c=*a;
*a=*b;
*b=c;
如何在不知道数据类型的情况下创建第三个变量

使用模板无效交换(迭代器a、迭代器b){
template <typename ITERATOR> void Swap (ITERATOR a, ITERATOR b) {
  using std::swap;
  swap(*a,*b);
}
使用std::swap; 互换(*a,*b); }
在C++11中,类型是
std::remove\u reference::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::swap”而不是此值,因为它是专门的
//用于许多类型,以避免不必要的副本分配。
模板无效价值交换(T&a、T&b){
T=a;
a=b;
b=t;
}
模板无效迭代器交换(Ia,Ib){
价值交换(*a,*b);
}
或者,对于性能良好的迭代器(包括指针和标准迭代器),类型可用作
std::iterator\u traits::value\u type
。如果有人编写了自己的迭代器类型,但没有提供默认的
iterator\u traits
所需的嵌套类型,或者没有专门为其提供
iterator\u traits
,那么这将不起作用

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


顺便说一句,您的特定函数已经存在为
std::iter\u swap

您的意思是
std::swap
,而不是
std::sort
,对吗?这些只是示例。我想对一个容器做一些重新安排/重新分配,在这里我只传递迭代器,我需要一些临时变量。@juanchopanza:不,我认为他不是这个意思。如果将
std::sort
替换为
std::swap
,这个问题甚至没有意义,因为
std::swap
不适用于迭代器。它只是交换迭代器本身,而不是它们指向的值,这显然不是OP的目的。@BenjaminLindley我明白了。这个问题似乎太离题了,我感到困惑。首先是一个关于
std::sort
实现的特定问题,然后是一个更一般的问题,即完全交换,但不是完全交换<代码>使用std::swap;互换(*a,*b)因为用户类型不需要专门化
std::swap
,所以它们可能只是在自己的命名空间中提供一个
swap
函数,并依赖ADL来获取它。