今天准备写一个最简单的插入排序,最开始打算实现如下函数:
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));
}
}