发现对标准库的理解不够

今天准备写一个最简单的插入排序,最开始打算实现如下函数:

template<typename Iter, typename Function>
void insertionSort(Iter first, Iter last, Function f)

在写得时候,突然发现, 因为插入排序,需要定义一个临时变量,这个变量的类型应该是*Iter所代表的类型, 但是, 在这里拿不到。 有点发晕, 查了一下标准库算法的一些实现, 发现标准库的实现中, 类型是用traits提取出来的, 以前就对traits有所了解,但一直没太明白,这次算是知道traits的用处了, 不过现在还是无法应用,先用简单一点的方式,完成我这个插入排序的测试吧。 接下来几天, 要研读标准库了。

现在的实现:

template<typename Function, typename _Ty>
void insertionSort(_Ty* first, _Ty* last, Function f)
{
 for (_Ty* it = first + 1; it != last; ++it)
 {
  _Ty value = *it;
  _Ty* it2 = it;
  while(it2 != first && f(value, *(it2 - 1)))
  {
   *it2 = *(it2 - 1);
   it2--;
  }
  *it2 = value;
 }
}

研读标准库之后,这个函数会不会有什么改变呢?

  重新实现如下:

#include <iterator>

template<typename _RandomAccessIterator, typename Function, class _Ty>
void __insertionSort_insert(_RandomAccessIterator first, _RandomAccessIterator insertIter, Function f, _Ty*)
{
 _Ty value = *insertIter;
 while(insertIter != first && f(value, *(insertIter - 1)))
 {
  *insertIter = *(insertIter - 1);
  insertIter--;
 }
 *insertIter = value;
}

template<typename _RandomAccessIterator, typename Function>
void insertionSort(_RandomAccessIterator first, _RandomAccessIterator last, Function f)
{
 for (_RandomAccessIterator it = first + 1; it != last; ++it)
 {
  __insertionSort_insert(first, it, f, std::_Val_type(first));
 }
}

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值