摘要:转载自:http://www.cnblogs.com/shiyangxt/archive/2008/09/11/1289493.html一、STL简介STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用
阅读全文
摘要:有一种常见的误解认为用struct保留字定义的类与用class定义的类有很大的区别。唯一的不同只是默认的成员保护级别和默认的派生保护级别,没有其他的区别。1. 用class定义的类,默认的成员访问级别为private。struct定义的类成员默认访问级别是public。2. 使用class关键字定义的派生类默认具有private继承,而用struct关键字定义的类默认具有public继承: class Base {/*....*/}; struct D1 : Base {/*....*/}; //public inheritance by default class D2 : Ba...
阅读全文
摘要:C中:1. static修饰函数中的变量(栈变量):改变变量的生存期,作用域不变仍为所在函数。 只被初始化一次。2. static修饰全局变量:限制全局变量只能被模块内访问,不可以在别的模块中用extern声明调用。3. static修饰函数:作用与修饰全局变量类似,也是限制该函数只能在模块内访问,不能再别的模块中用extern声明调用。例如:文件a.cstatic int i; //只在a文件中用int j; //在工程里用static void init() //只在a文件中用{}void callme() //在工程中用{ sta...
阅读全文
摘要:1. inline是编译时展开,必须有实体;(不考虑不展开的假inline)2. static属于class自己的,也必须有实体;3. 构造函数、复制构造函数。virtual函数基于vtable(内存空间),constructor函数如果是virtual的,调用时也需要根据vtable寻找,但是constructor是virtual的情况下是找不到的,因为constructor自己本身都不存在了,创建不到class的实例,没有实例,class的成员(除了public static/protected static for friend class/functions,其余无论是否virtual
阅读全文
摘要:所谓重载,就是重新赋予新的含义,函数重载就是对一个已有的函数赋予新的含义,使之实现新功能。运算符的重载主要存在两种形式,一种是作为类的成员函数进行使用,另一种则是作为类的友元函数进行使用。运算符的重载的形式为:返回类型 operator 运算符符号(参数说明) { //函数体的内部实现 }例如,能否用“+”号进行两个复数的相加,在C++中不能在程序中直接用运算符“+”对复数进行相加运算,用户必须自己设法实现复数相加。例如用户可以通过定义一个专门的函数来实现复数相加。 1 /* 2 实现复数类中的运算符重载 3 定义一个复数类重载运算符+、-、*、/,使之能用于复数的加减乘除。 4 方案一:使.
阅读全文
摘要:当使用带有const的指针时其实有两种意思。一种指的是你不能修改指针本身的内容,另一种指的是你不能修改指针指向的内容。听起来有点混淆一会放个例子上来就明白了。 先说指向const的指针,它的意思是指针指向的内容是不能被修改的。它有两种写法。 constint* p; (推荐)intconst* p; 第一种可以理解为,p是一个指针,它指向的内容是constint类型。p本身不用初始化它可以指向任何标示符,但它指向的内容是不能被改变的。 第二种很容易被理解成是p是一个指向int的const指针(指针本身不能被修改),但这样理解是错误的,它也是表示的是指向const的指针(指针指向的内容是不能被修
阅读全文
摘要:排序法平均时间最差情形稳定度额外空间备注冒泡O(n2) O(n2)稳定O(1)n小时较好交换O(n2) O(n2)不稳定O(1)n小时较好选择O(n2)O(n2)不稳定O(1)n小时较好插入O(n2)O(n2)稳定O(1)大部分已排序时较好基数O(logRB)O(logRB)稳定O(n)B是真数(0-9),R是基数(个十百)ShellO(nlogn)O(ns) 1<s<2不稳定O(1)s是所选分组快速O(nlogn)O(n2)不稳定O(nlogn)n大时较好归并O(nlogn)O(nlogn)稳定O(n)n大时较好堆O(nlogn)O(nlogn)不稳定O(1)n大时较好若n较小:
阅读全文
摘要:例如待排序数组[62,14,59,88,16]简单点五个数字分配10个桶,桶编号为0-9,以个位数数字为桶编号依次入桶,变成下边这样| 0 | 0 | 62 | 0 | 14 | 0 | 16 | 0 | 88 | 59 || 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |桶编号将桶里的数字顺序取出来,输出结果:[62,14,16,88,59]再次入桶,不过这次以十位数的数字为准,进入相应的桶,变成下边这样:由于前边做了个位数的排序,所以当十位数相等时,个位数字是由小到大的顺序入桶的,就是说,入完桶还是有序| 0 | 14,16 | 0 | 0 | 0 | 59
阅读全文
摘要:1 /**************** 2 思路:假设待排序有n个记录,将这n个记录看成n个有序的子序列,每个子序列长度为1, 3 然后两两归并。 4 如何将将二个有序数列合并:这个非常简单,只要从比较二个数列的第一个数, 5 谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空, 6 那直接将另一个数列的数据依次取出即可。 7 ****************/ 8 #include 9 10 using namespace std;11 12 //将有二个有序数列arr[first...mid]和arr[mid...last]合并。主要是merge这个函数13 ..
阅读全文
摘要:1 /********************* 2 快排思想: 3 1.i =L; j = R; 选取第一个数为基准数,将基准数挖出形成第一个坑a[0]。 4 2. j—从后向前找到比基准数小的,找到后将此数挖出填入前一个坑中a[i],形成新的坑a[j] 5 3. i++从前向后找到比基准数大的,找到后将此数挖出填入前一个坑中a[j] 6 4. 重复执行2、3步直到i==j,将基准数填入即可 7 ***********************/ 8 #include 9 10 using namespace std;11 12 int Partition(int * arr, int l..
阅读全文
摘要:思想:一共n-2次外循环,每次循环将最大的数放到未排序的数列的最后。#include using namespace std;void BubbleSort(int* arr, int n){ bool Swap; int i,j; for(i=0; i arr[j+1]) //较大的放到后面 { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; Swap = true; ...
阅读全文
摘要:不稳定。时间复杂度:建堆时间代价O(n),每次删除堆顶重新建堆O(logn), 所以总时间:O(n)+O(nlogn)=O(nlogn)。最好、最差、平均都是O(nlogn)。空间复杂度:用到一个临时变量,O(1)。总结:由于时间复杂度O(nlogn)较小,因此适用于数组n较大的情况。
阅读全文
摘要:/***************思路:外层循环:从0到n-1遍历数组。 对于第i个元素,内层循环:从i+1开始遍历数组找到最小的元素,与i交换。****************/#include using namespace std;void SelectSort(int* arr, int n){ int i,j,temp,min_index; for(i=0; i >n; arr = new int[n]; cout>arr[i]; } SelectSort(arr,n); cout<<"The outcome:"<<endl; .
阅读全文
摘要:思想:插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。从i=1开始往后遍历,对于每个数据记录为temp,从该数据向前探索若比temp大则后移,直至第一个比temp小的数据,将temp插入到这个数据之后。 1 #include 2 3 using namespace std; 4 5 void InsertSort(int* arr,int n) 6 { 7 int i,j,temp; 8 for(i=1;i=0 && temp >n;27 arr = new int[n];28 cout>arr[i];32 ...
阅读全文
摘要:题目:把一个数组最开始的若干个元素搬到数组末尾我们称之为数组的旋转。要求:输入一个递增排序的数组的旋转,输出旋转数组中的最小数字。例如{3,4,5,1,2}是{1,2,3,4,5}的一个旋转,该数组的最小值为1。思路:旋转后的数组可分为两个有序数组,最小的数恰好是分界点。由于是局部有序的,想到用二分查找的方法去查找最小元素。和二分类似,每次取一个index_mid为中间值,如果该数大于index1则说明最小数在后面;如果该数小于index2,则说明最小数在该数前面或者就是该数。例外情况:1.旋转了0个数,即数组仍是有序的;2.mid=index1=index2,此时必须暴力求解。 1 #inc
阅读全文
摘要:函数指针:1) 函数指针的初始化。函数如下:1intCompareString(conststring&str1,conststring&str2)2{3returnstr1.compare(str2);4}函数的初始化有两种方式:第一种,也是最普遍的方式:1int(*CompareFunction)(conststring&,conststring&)=CompareString;第二种,是使用typedef定义函数类型,这种写法有助于对代码的理解:1typedefint(*CompareFunctionType)(conststring&,const
阅读全文
摘要:《程序员面试宝典》上也有经典的火车进站问题,类似。如果12345是压栈顺序,序列45321可能是出栈顺序,但序列43512不可能。规律:对序列中任意元素n,排在n后且比n小的元素一定是从大到小顺序排列的,可以不相邻。如果要用编程解决,思路应该是:依次判断出栈序列中的每个数字,如果下一个弹出的数字是栈顶数字则弹出;如果不是则把剩余的未入栈的数字依次入栈,直到把下一个需要弹出的数字压到栈顶为止。如果所有数字都入栈了还未遇到下一个弹出的数字,则该序列不可能是出栈序列。
阅读全文
摘要:题目:定义栈数据结构,并在该数据结构中实现一个能获得栈最小元素的函数min。要求push,min,pop时间都是O(1)。思路:要用一个辅助栈,每次有新元素压栈时辅助栈压入当前最小元素;min函数直接取辅助栈栈顶元素即可;有元素弹出时辅助栈元素也弹出,这样栈顶就是剩下的元素中的最小的了。 1 #include 2 #include 3 using namespace std; 4 5 template 6 class StackWithMin 7 { 8 public: 9 void Push(const T& element);10 T Min();11 voi...
阅读全文
摘要:题目:给出队列声明,要求实现AppendTail和DeleteHead函数。template class CQueue{public: void AppendTail(const T& element); T DeleteHead();private: stack stack1; stack stack2;};思路:要用两个先进后出的栈实现先进先出的队列。压栈总是压入stack1,要获得队列头时:如果stack2为空,则把stack1依次弹出栈并压入stack2,取stack2栈顶元素;如果stack2不为空,则直接取stack2栈顶元素。 1 #include 2 ...
阅读全文
摘要:题目:输入两个递增排顺序的链表,合并这两个链表并使合并后的链表仍是递增排序的。重点:1.代码鲁棒性:要判断输入的两个链表都为NULL;其中一个链表为NULL的情况。2.用递归实现,注意递归的思路。 1 #include 2 3 using namespace std; 4 5 struct Node 6 { 7 int val; 8 Node* next; 9 };10 11 12 void PrintLink(Node* phead)13 {14 Node* p = phead;15 while(p != NULL)16 {17 ...
阅读全文