STL源码剖析(算法)
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源码剖析(算法)的更多相关文章
- STL源码剖析——算法#1 内存处理基本工具
我们在学习序列式容器时,我们经常会遇到这三个函数:uninitialized_copy.uninitialized_fill.uninitialized_fill_n.在那时我们只是仅仅知道这些函数的 ...
- STL"源码"剖析-重点知识总结
STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合 ...
- 【转载】STL"源码"剖析-重点知识总结
原文:STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点 ...
- (原创滴~)STL源码剖析读书总结1——GP和内存管理
读完侯捷先生的<STL源码剖析>,感觉真如他本人所说的"庖丁解牛,恢恢乎游刃有余",STL底层的实现一览无余,给人一种自己的C++水平又提升了一个level的幻觉,呵呵 ...
- STL源码剖析 迭代器(iterator)概念与编程技法(三)
1 STL迭代器原理 1.1 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型,STL设计的精髓在于,把容器(Containers)和算法(Algorithms)分开,而迭代器(i ...
- STL"源码"剖析
STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略 ...
- 《STL源码剖析》相关面试题总结
原文链接:http://www.cnblogs.com/raichen/p/5817158.html 一.STL简介 STL提供六大组件,彼此可以组合套用: 容器容器就是各种数据结构,我就不多说,看看 ...
- STL源码剖析之序列式容器
最近由于找工作需要,准备深入学习一下STL源码,我看的是侯捷所著的<STL源码剖析>.之所以看这本书主要是由于我过去曾经接触过一些台湾人,我一直觉得台湾人非常不错(这里不涉及任何政治,仅限 ...
- 《STL源码剖析》学习之traits编程
侯捷老师在<STL源码剖析>中说到:了解traits编程技术,就像获得“芝麻开门”的口诀一样,从此得以一窥STL源码的奥秘.如此一说,其重要性就不言而喻了. 之前已经介绍过迭代器 ...
随机推荐
- 多进程失败拉起的demo
#include <iostream> #include <vector> #include <unistd.h> #include <stdlib.h> ...
- Spring源码阅读入门指引
本文大概的对IOC和AOP进行了解,入门先到这一点便已经有了大概的印象了,详细内容请看下文. AD: 本文说明2点: 1.阅读源码的入口在哪里? 2.入门前必备知识了解:IOC和AOP 一.我们从哪里 ...
- Python开发基础-Day12模块1
time模块 在Python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的时间字符串: (1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月 ...
- 修改ORACLE实例名
修改数据库的SID 举例说明,我的数据库的SID叫testdb,现在要改成oral.更改ORACLE数据库的sid,涉及到的用东西比较多,但是大概来说就以下六步. 1.停止所有的Oracle服务. ...
- centos yum命令报错
Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile Could not retriev ...
- HDU 4639 Hehe (2013多校4 1008 水题)
Hehe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 通过命名管道协议方式访问群集SQL的一个小问题
原来的单机实例SQL如果开放命名管道协议访问可以在.Net程序的连接字符串中增加“;Net=dbnmpntw"以通过命名管道协议方式访问,但是当迁移到群集SQL后,.net通过它可能无法正常 ...
- Java读写文件,中文乱码解决
读文件:使用new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); Strin ...
- 客户端的javascript改变了asp.net webform页面控件的值,后台代码中如何获取修改后的值。
客户端的javascript改变了asp.net webform页面控件的值,后台代码中如何获取修改后的值. 无论是什么的html控件,只要加上了runat="server" ...
- HDU 4886 TIANKENG’s restaurant(Ⅱ) hash+dfs
题意: 1.找一个字符串s使得 s不是给定母串的子串 2.且s要最短 3.s在最短情况下字典序最小 hash.,,结果t掉了...加了个姿势怪异的hash值剪枝才过.. #include <cs ...