
STL
cyningsun
这个作者很懒,什么都没留下…
展开
-
用STL求子串
#include#include using namespace std;void main(){ int beg,len;//子串开始位置,长度 vector cvec;//声明容器 char temp; while (cin.get(temp)) cvec.push_back(temp);//添加元素 cout>beg>>len; if((beg+len)>cvec.size())//判断求子串的输入是否有误 { cout::iterator it原创 2010-07-07 10:37:00 · 1201 阅读 · 2 评论 -
STL经典算法集锦
所谓经典算法是指STL中有一定的复杂性并且又经常用到的算法。其他算法多是较为容易,利用STL操作很容易实现就不在此之列了。共计15个算法,包括: 1、list::sort 2、heap 3、partition 4、rotate(链表版,数组版,即random_原创 2012-03-23 10:01:45 · 1518 阅读 · 0 评论 -
STL经典算法集锦<一>之list::sort
算法中使用到的数据结构:typedef struct Node* Link;struct Node{ int value; Link next;};算法代码://链表的归并void merge(Link& first,Link& second){ Node newHead; Link temp=&newHead; while(first!=NULL&&second!原创 2012-03-23 15:27:36 · 1574 阅读 · 0 评论 -
数组循环移位问题
原文地址:http://blog.youkuaiyun.com/jcwkyl/article/details/3874629《编程之美》中的题目要求只使用两个附加变量。王晓东编著的《算法设计与实验题解》中要求只用到O(1)的辅助空间。其它地方两本书的要求相同,都是O(n)的时间复杂度。两本书中的解法总结起来就是三种方法:(1)循环换位算法(2)三次反转算法(3)排列循环算法。这三种算法在王晓东的著作中转载 2012-04-25 16:23:22 · 1597 阅读 · 0 评论 -
STL经典算法集锦<五>之查找(lower_bound/upper_bound/binary_search)
这三个算法都比较的常用,而且具有一定的相似的性。理论依据也很明显,下面就直接贴出自己的实现版本。其中lower_bound与upper_bound实现了两个版本。版本一与STL的实现方法完全相同,以数据的总长度折半,版本二则是直接取前后的中点。当然本质上没有太大区别。lower_bound版本一:int lowerBound(int array[],int left,int right,i原创 2012-04-25 17:01:06 · 2506 阅读 · 0 评论 -
STL经典算法集锦<六>之排列(next_permutation/prev_permutation)
STL中涉及到数组的排列的有两个函数,即next_permutation/prev_permutation,分别用于求上一个以及下一个排列。两函数的算法使用的原理大体相同。以next_permutation为例,列出算法并解释。算法:首先,从最为段开始往前寻找两个相邻的元素,令第一个元素索引为endi第二个元素索引为endii,且满足array[endi]。然后,再从最尾端开始向前检测原创 2012-05-07 15:54:09 · 2453 阅读 · 1 评论 -
SGI-STL学习笔记之IntroSort
Quick sortQuick sort 的精神在于将大区间分割为小区间,分段排序。每个小区间排序完成后,串接起来的大区间就完成了排序。最坏的情况发生在分割时产生出的一个空的子区间。threshold(阈值)面对一个只有十来个元素的小序列,使用像Quick sort这样复杂而(可能)需要大量运算的排序算法,是否划算?在小数据量的情况下,甚至简单如Insertion Sort者也可能原创 2012-05-08 17:27:37 · 2919 阅读 · 3 评论 -
STL经典算法集锦<四>之rotate
STL在rotate上的优化是极尽其所能的。分别对前向访问,双向访问,随机访问的数据结构实现了三个版本的rotate。下面是自己按照对三种算法的理解,自己进行的实现。实现中我尽力避免使用C++的特性,从而以后可以在纯C的代码中使用。下面是我使用到的数据结构,单向链表与双向链表,用于实现算法和验证算法的正确性://单链表节点typedef struct Node* Link;stru原创 2012-04-25 16:47:08 · 2530 阅读 · 0 评论 -
STL经典算法集锦<八>之IntroSort
STL的sort算法的优化策略:1、 数据量大时采用QuickSort,分段递归排序。2、 一旦分段后的数据量小于某个门槛,为避免Quick Sort的递归调用带来的额外负荷,就改用Insertion Sort。3、 如果层次过深,还会改用HeapSort4、 “三点中值”获取好的分割IntroSort的实现代码为://数据量的分界线,决定了使用quick so原创 2012-05-08 20:21:47 · 5472 阅读 · 1 评论 -
STL经典算法集锦<七>之随机洗牌(random_shuffle)
将一个数组中的元素序列打算顺序进行重排,并需要保证重排后的每一种结果是等概率且随机的。下面的两种算法哪一种是正确的?(注:random(a,b)返回一个a~b的随机整数)1. for i=1 to n do swap( a[i], a[random(1,n)] );2. for i=1 to n do swap( a[i], a[random(i,n)] );解释:首先,1~n原创 2012-05-08 13:31:03 · 9912 阅读 · 5 评论 -
STL经典算法集锦<三>之partition与qsort
STL的分割算法主要使用了仿函数来实现。而此处的分割则不,此处实现了两种形式的分割算法:非随机分割算法、随机分割算法(随机算法是在非随机算法的基础上封装而成)。而快速排序则只需简单依赖分割算法就能实现。非随机分割算法:int partition(int array[],int left,int right){ //选择最右侧的元素作为分割标准 int index = left;原创 2012-03-24 20:15:42 · 2051 阅读 · 0 评论 -
STL经典算法集锦<二>之堆算法
堆算法主要包括建立最大堆和堆排序算法。所使用建堆的数组将以0开始存储数据。下面将以两种方法建堆:自底向上的建堆(STL和算法导论中使用到的)、自顶向下建堆(即插入建堆的方法)公共操作:int parent(int i){ return (int)((i-1)/2);} int left(int i){ return 2 * i+1;} int rig原创 2012-03-24 19:55:27 · 1689 阅读 · 0 评论 -
文本行的读取和排序
<br /> #include<iostream>#include <algorithm>#include <vector>using namespace std;struct strtab_cmp { typedef vector<char>::iterator strtab_iterator; //以pair的first和second标明一行文本,进行字典编纂式的比较 bool operator()(const pair<strtab_iterator,strtab_it原创 2010-07-09 09:27:00 · 953 阅读 · 0 评论 -
SGI-STL学习笔记之allocator
空间配置器的标准接口:allocator::value_typeallocator::pointerallocator::const_pointerallocator::referenceallocator::const_refrenceallocator::size_typeallocator::difference_typepointer allocator::allocate(size_type n,const void*=0)//配置空原创 2011-03-05 15:32:00 · 3382 阅读 · 9 评论 -
size_t(-1) / sizeof(_Tp)到底是何意义?
Ø size_t(-1)/sizeof(_Tp)到底是什么意义?以32位机来说,它代表了实现/平台允许你放入容器的最大元素数目,对于std::vector最大容量为2^32 / sizeof(T) 个元素。换句话来说, 也就是我能完全使用4GiB虚拟内存地址空间(实际不可能)而填充的最大元素数目。Ø 为什么size_t(-1)为2^32?size_t通常在32位机上定义为32位,而在64位机上定义为64位的无符号整型。通过强制类型转换,size_t(-1)恰能代表其能表示的最大值,即2^32 (2^64原创 2011-03-06 20:05:00 · 2942 阅读 · 0 评论 -
勘误《STL源码剖析》——摘录
说明:将修润、印务和一些较为明显的笔误、错乱、讨论予以删除,仅仅保留有探讨和学习意义的部分。依照上述要求完成此份摘录,以下为摘录部分:本勘误档更新日期: 2005/02/01《STL 源码剖析》繁体版碁峰信息股份有限公司 出版, 2002注意:以下各项修正皆以日期排序======================================================书籍内容更正,有两种作法,一是在因特网上做个专属勘误网页,让大家上去看。这是比较实时的作法。而更理想更负责的作法是:不但有勘误网页,原创 2011-04-03 17:39:00 · 2152 阅读 · 1 评论 -
SGI-STL学习笔记之heap算法
heap算法binary heap是一种Complete binary tree,也就是,整棵binarytree 除叶子节点之外,是填满的,而最底层的叶节点由左至右又不得有空隙。heap的实现假设动用一个小技巧3,将 array 的 #0 元素保留(或设为无限大值或无限小值),那么当 complete binary tree中的某个节点位于 array 的i 处,其左子节点必位于 array 的2i处,其右子节点必位于 array 的2i+1 处,其父节点必位于「i/2原创 2011-04-04 03:04:00 · 1384 阅读 · 0 评论 -
SGI-STL学习笔记之RB-tree part1
二叉搜索树二叉搜索树(binary search tree),可提供对数时间(10garithmictime)3的元素插入和访问。二叉搜索树的节点放置规则是:任何节点的键值一定大干其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。因此,从根节点一直往左走,直至无左路可走,即得最小元素:从根节点一直往右走,直至无右路可走,即得最大元素。查找图5-4所示的就是一棵二叉搜索树。要在一棵二叉搜索树中找出最大元素或最小元素,是一件极简单的事:就像上述所言,一直往左走或一直往右走即是。插入插人新元素时,原创 2011-04-04 19:17:00 · 1213 阅读 · 0 评论 -
SGI-STL学习笔记之RB-tree part2
RB-tree迭代器voidincrement(){ if(node—>right!=0) //如果有右子节点。状况 { node=node—>right; //就向右走 while(node—>left!;)//然后一直往左子树走到底 node=node—>left;//即是解答 }else{ //没有右子节点。状况 base_ptr原创 2011-04-04 19:44:00 · 1236 阅读 · 0 评论 -
SGI-STL学习笔记之IntroSort
Quick sortQuick sort 的精神在于将大区间分割为小区间,分段排序。每个小区间排序完成后,串接起来的大区间就完成了排序。最坏的情况发生在分割时产生出的一个空的子区间。threshold(阈值)面对一个只有十来个元素的小序列,使用像Quick sort这样复杂而(可能)需要大量运算的排序算法,是否划算?在小数据量的情况下,甚至简单如Insertion Sort者也可能快过Quick Sort——因为Quick Sort 会为了极小的子序列而产生许多的函数递归调用。监狱这种情况,适度的评估序列的原创 2011-04-09 16:24:00 · 1155 阅读 · 0 评论 -
SGI-STL学习笔记之list::sort()
// list不能使用STL算法sort(),必须使用自己的sort() member //function,因为STL算法sort()只接受RamdonAccessIterator.//本函式采用quick sort.template void list::sort() { // 以下判断,如果是空白串行,或仅有一个元素,就不做任何动作原创 2011-04-08 20:43:00 · 1266 阅读 · 2 评论 -
Introduction to the Standard Template Library
The Standard Template Library, or STL, is a C++ library of container classes, algorithms, and iterators; it provides many of the basic algorithms and data structures of computer science. The STL is a原创 2010-07-16 18:40:00 · 948 阅读 · 0 评论