STL中算法是基于迭代器来实现的。

有了容器中迭代器的实现(对operator*、operator++等的重载),STL中大部分算法实现就显得很简单了。

先看一例关于find算法的实现:

 template <class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& value) {
// 直接利用iterator中的operator++、operator*、operator!=实现
// 默认使用class T的operator!=
while (first != last && *first != value) ++first;
return first;
} template <class InputIterator, class Predicate>
InputIterator find_if(InputIterator first, InputIterator last,
Predicate pred) {
// 能接受一个仿函数 用来指定find的条件
while (first != last && !pred(*first)) ++first;
return first;
}

其它的基本算法实现都差不多,它们一般只是执行单纯的数据移动、线性查找、计数、循环遍历等操作。

比较复杂的算法一般都关于排列、排序之类的,这次只要说说SGI STL中sort()的实现。

SGI STL中的sort()

SGI STL中的排序算法混合了quick sort、heap sort、insert sort三种排序算法。

总体上用的是quick sort,分割到一定深度(2^k < = n)的时候会使用heap sort,

在分割区域元素大小小于阀值(16)时最后执行的是insert sort。

下面是sort()的的基本框架:

 template <class RandomAccessIterator>
inline void sort(RandomAccessIterator first, RandomAccessIterator last) {
if (first != last) {
// 使用quick sort、heap sort排序 直到所有分割区域元素大小都小于阀值 __stl_threshold = 16
__introsort_loop(first, last, value_type(first), __lg(last - first) * );
// 最后对其分割区域都执行一次insert sort
__final_insertion_sort(first, last);
}
} // 阀值k满足2^k <= n
template <class Size>
inline Size __lg(Size n) {
Size k;
for (k = ; n > ; n >>= ) ++k;
return k;
}

然后看看introsort_loop的实现:

 template <class RandomAccessIterator, class T, class Size>
void __introsort_loop(RandomAccessIterator first,
RandomAccessIterator last, T*,
Size depth_limit) {
while (last - first > __stl_threshold) { // 元素足够少 返回由insert sort处理
if (depth_limit == ) { // 分割恶化 采用heap_sort
partial_sort(first, last, last); // 实现为heap_sort
return;
}
// 深度
--depth_limit;
// key为first middle last的中值
RandomAccessIterator cut = __unguarded_partition
(first, last, T(__median(*first, *(first + (last - first)/),
*(last - ))));
// 递归的处理[cut, last)
__introsort_loop(cut, last, value_type(first), depth_limit);
// 返回while 继续处理[first, cut)
last = cut;
}
}

STL源码剖析(算法)的更多相关文章

  1. STL源码剖析——算法#1 内存处理基本工具

    我们在学习序列式容器时,我们经常会遇到这三个函数:uninitialized_copy.uninitialized_fill.uninitialized_fill_n.在那时我们只是仅仅知道这些函数的 ...

  2. STL"源码"剖析-重点知识总结

    STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合 ...

  3. 【转载】STL"源码"剖析-重点知识总结

    原文:STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点 ...

  4. (原创滴~)STL源码剖析读书总结1——GP和内存管理

    读完侯捷先生的<STL源码剖析>,感觉真如他本人所说的"庖丁解牛,恢恢乎游刃有余",STL底层的实现一览无余,给人一种自己的C++水平又提升了一个level的幻觉,呵呵 ...

  5. STL源码剖析 迭代器(iterator)概念与编程技法(三)

    1 STL迭代器原理 1.1  迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型,STL设计的精髓在于,把容器(Containers)和算法(Algorithms)分开,而迭代器(i ...

  6. STL"源码"剖析

    STL"源码"剖析-重点知识总结   STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略 ...

  7. 《STL源码剖析》相关面试题总结

    原文链接:http://www.cnblogs.com/raichen/p/5817158.html 一.STL简介 STL提供六大组件,彼此可以组合套用: 容器容器就是各种数据结构,我就不多说,看看 ...

  8. STL源码剖析之序列式容器

    最近由于找工作需要,准备深入学习一下STL源码,我看的是侯捷所著的<STL源码剖析>.之所以看这本书主要是由于我过去曾经接触过一些台湾人,我一直觉得台湾人非常不错(这里不涉及任何政治,仅限 ...

  9. 《STL源码剖析》学习之traits编程

    侯捷老师在<STL源码剖析>中说到:了解traits编程技术,就像获得“芝麻开门”的口诀一样,从此得以一窥STL源码的奥秘.如此一说,其重要性就不言而喻了.      之前已经介绍过迭代器 ...

随机推荐

  1. CodeForces - 995B Suit and Tie

    题面在这里! 明明可以出成n<=1e5但是因为拒绝写数据结构而只出到n<=100,,,出题人真的很棒棒.. 一个显然的贪心就是,把和当前序列最左端的数匹配的数移到它的右边,这样迭代下去总是 ...

  2. [UOJ348]州区划分

    设$f_i$表示选状态为$i$的点的答案,$s_i$表示状态为$i$的点权和,$不存在欧拉回路g_i=[i\,不存在欧拉回路]s_i$ 那么$f_i=\sum\limits_{j\subset i}\ ...

  3. python学习第九十天:vue补习2

    Vue 八.重要指令 v-bind <!-- 值a --> <div v-bind:class='"a"'></div> <!-- 变量a ...

  4. PHP数组和数据结构(上)

    1.数组的声明 两种方法: 直接给数组元素赋值 使用array()函数声明 说明: (1)索引数组的下标可以是非连续的值,只要在初始化时指定非连续的下标值即可 如果指定的下标值已经声明过,则属于对变量 ...

  5. SecureCRT connecting VM Linux show error message: The remote system refused the connection.

    SecureCRT connecting VM Linux show error message: The remote system refused the connection.

  6. SQL 的四种分类 DDL,DML,DCL,TCL

    DDL (数据定义问题) 数据定义语言 - Data Definition Language 用来定义数据库的对象,如数据表.视图.索引等DDL不需要commit.CREATEALTERDROPTRU ...

  7. postgres10配置huge_pages

    操作系统 修改/boot/grub2/grub.cfg 定位到第一个'menuentry 'CentOS Linux',在"linux16 /vmlinuz"最后面添加 numa= ...

  8. 《Go语言实战》笔记之第四章 ----数组、切片、映射

    原文地址: http://www.niu12.com/article/11 ####数组 数组是一个长度固定的数据类型,用于存储一段具有相同的类型的元素的连续块. 数组存储的类型可以是内置类型,如整型 ...

  9. [转]Working with Parameters and Return Codes in the Execute SQL Task

    本文转自:http://msdn.microsoft.com/zh-cn/magazine/cc280502(en-us,SQL.100).aspx SQL statements and stored ...

  10. Dr.memory

    Run Dr.memory on visual c++ 2013 Title: Dr. Memory Command: C:\Program Files (x86)\Dr. Memory\bin\dr ...