
STL
文章平均质量分 75
ww32cc
这个作者很懒,什么都没留下…
展开
-
STL自定义仿函数和组合型函数适配器
1.自定义仿函数STL提供了算术类、相对关系类、逻辑运算类的预定义仿函数,但为了满足程序的需要,大多数情况下需要我们自己定义仿函数。如果希望它们能够和函数适配器搭配使用,就必须满足某种条件:必须提供一些类型成员来反映其参数和返回值的类别。STL提供了以下两种结构:原创 2015-07-25 17:49:11 · 636 阅读 · 0 评论 -
谓词函数predicates和仿函数functors
谓词函数是一个判断式,一个返回bool值的函数或者仿函数。C++ standard library P264:并非所有返回布尔值的仿函数都是合法的谓词函数。因为使用两个相同的参数调用一个一元谓词函数,应该总是返回相同的结果(与调用次数无关)。敲代码的时候犯了一个小错误,写仿函数的operator()时,由于操作符中并未使用额外的参数,所以函数定义时默认成了不传参,结果编译错误。原创 2015-07-21 16:41:43 · 709 阅读 · 2 评论 -
STL源码—— rotate算法理解
rotate算法实现了区间内元素的循环移位,将[first, middle)内的元素和[middle, last)内的元素互换,middle所指的元素会成为容器的第一个元素。如下图所示:由于不同迭代器造成算法的效率有所不同,因此设计为双层架构。templateinline void rotate(ForwardIterator first, ForwardIterator m原创 2015-10-09 16:29:57 · 1078 阅读 · 1 评论 -
通过reverse_iterator的base()得到iterator
调用reverse_iterator的base成员函数可以产生“对应的”iterator。vector v;v.reserve(5);for(int i = 0;i < 5; ++ i) { // 向vector插入1到5v.push_back(i);}vector::reverse_iterator ri = // 使ri指向3find(v.rbegin(), v.rend(),原创 2015-08-14 18:33:02 · 3416 阅读 · 1 评论 -
deque及迭代器失效问题
deque由一段一段的定量连续空间构成,采用一个表(map)来记录每个连续空间的首址,map是一小块连续的空间,目的是便于迭代器的寻址(map+1即可跳转到下一个连续空间的首址)。map中的每一个元素(node)都是指针,指向另一端(较大的)连续线性空间,称为缓冲区,缓冲区才是deque的储存空间主体。具体机制如下所示:其中,对迭代器it的解引用得到的是cur位置处对应的元素。de原创 2015-09-05 15:18:04 · 5020 阅读 · 0 评论 -
STL源码——list sort:归并排序的非递归实现
由于STL中提供的sort算法是用在RandomAccessIterator上的,而list迭代器不具备随机访问的特性,所以对list进行排序不能使用algorithm中的sort算法,而应该使用list的成员函数sort。对list进行排序,最直接的想法就是用MergeSort,但是每次找中点就需要O(n),可能考虑到这点,成员函数sort并没有采用这种方式实现,而是用了非递归版的MergeSo原创 2015-12-13 13:45:59 · 834 阅读 · 1 评论 -
STL源码——function adapter函数适配器/函数配接器
function adapters是指能够将function objects(函数对象)与另一个function objects、某个值、某个一般函数结合起来的function objects。通过function adapters可以把多个function objects结合起来,形成强大的表达式。使用时包含头文件即可。通过function adapter的绑定、组合、修饰能力,可以创造原创 2015-10-21 21:43:27 · 513 阅读 · 0 评论 -
STL源码——排列生成算法(next-permutation、pre-permutation)
排列生成算法有三种:序数法、字典序法、换位法。本文只讨论前两种较常用的方法。一.序数法所谓序数,指的是某个排列在这n的数的所有排列中按字典序排序的序数。已知一个排列,可以用康托展开求其序数。假设排列为,这个排列对应的序数为。其中表示位于第i位右边比小的元素的个数,排列组合意义上理解:设当前排列,考察第位,第位比小的排列的一定比小,第位有中情况,后面的位的情况为,所以在位比排列小的排列有原创 2015-10-11 16:46:23 · 983 阅读 · 0 评论 -
STL源码——RB-Tree insert操作
看STL源码剖析时,真正的插入函数__insert(base_ptr x, base_ptr y, const value& v)时,发现参数x几乎没什么用,查了一些资料,发现x是在调用另一个insert重载函数时发挥作用的,于是整理了一下insert函数。原创 2015-09-17 19:48:09 · 1838 阅读 · 0 评论 -
remove算法和erase成员函数
1. remove算法和容器的erase成员函数remove 操作移除[first,last)之中所有与value相等的元素。这一算法并不真正从容器中删除那些元素(换句话说容器的大小并没有改变),而是将每一个不与value相等的元素轮番赋值给first之后的空间。也就是说,所有和value相同值的元素都会被覆盖,而其他的元素都会依次前移。最后remove返回"指向最后一个 '有原创 2015-07-31 15:07:08 · 703 阅读 · 0 评论 -
STL源码——SGI 空间配置器
由于小型区块分配时可能造成内存破碎问题,SGI设计了两级配置器,第一级配置器直接使用malloc和free,第二级配置器则视情况采取不同的策略:当配置的区块超过128Bytes时,调用第一级配置器;当配置区块小于128Bytes时,采用复杂的内存池整理方式,而不再求助于第一级配置器。使用第一级配置器还是同时开放第二级配置器,取决于__USE_MALLOC是否被定义。#ifdef __USE原创 2015-09-10 19:53:43 · 935 阅读 · 1 评论