c++
文章平均质量分 51
瑞-板凳精神
星光不问赶路人-你可以不平凡
展开
-
数据结构——跳表和散列
虽然在n个元素的有序数组上折半查找所需要的时间为O(logn),但是在有序链表上查找所需要的时间为O(n)。为了提高有序链表的查找性能,可以在全部或部分节点上增加额外的指针。在查找时,通过这些指针,可以跳过链表的若千个节点,不必从左到右连续查看所有节点。增加了额外的向前指针的链表叫做跳表(skiplist)。它采用随机技术来决定链表的哪些节点应增加向前指针,以及增加多少个指针。基于这种随机技术,跳表的查找、插入、删除的平均时间复杂度为O(logn)。然而,最坏情况下的时间复杂度却变成O(n)。散列是.原创 2021-04-16 12:00:26 · 788 阅读 · 2 评论 -
-栈的应用-
计算机是如何执行递归函数的呢? 答案是使用递归工作栈(recursion stack)。当一个函数被调用时,一个返回地址( 即被调函数一旦执行完,接下去要执行的程序指令的地址)和被调函数的局部变量和形参的值都要存储在递归工作栈中。当执行一次返回时,被调函数的局部变量和形参的值被恢复为调用之前的值(这些值存储在递归工作栈的顶部),而且程序从返回地址处继续执行,这个返回地址也存储在递归工作栈的顶部。如果把数组线性表的右端定义为栈顶,那么入栈和出栈操作对应的就是线性表在最好情况下的插入和删除操作。结果两个.原创 2021-04-14 17:40:55 · 212 阅读 · 0 评论 -
数组和矩阵
数组在图7-1中,从第一行开始,依次对每一行的索引从左至右连续编号,得到图7-2a所示的映射结果。它把二维数组的索引映射为[0,n-1]中的数,这种映射方式称为行主映射( row major mapping)。索引对应的数称为行主次序( row-major order)。图7-2b是另一种映射模式,称为列主映射图7-1 整型数组score [3] [6]的索引排列表( column major mapping)。在列主映射中,对索引的编号从最左列开始,依次对每一列的索引从上到下连续编号。在行主次序原创 2021-04-14 10:07:07 · 534 阅读 · 0 评论 -
_链表应用
箱子排序一种更快的排序方法是箱子排序( bin sort)。这种排序首先把分数相同的节点放在同一个箱子里,然后把箱子链接起来就得到有序的链表。我们需要n个箱子,每个箱子对应一个分数。每一个箱子都是一个链表箱子排序需要做的是:1.逐个删除输入链表的节点,把删除的节点分配到相应的箱子里;2.把每一个箱子中的链表收集并链接起来,使其成为一个有序链表。如果输入链表是链式类型,那么我们能够做的是: 1. 连续删除链表的首元素,并将其插入相应的某个箱子的链表首位; 2. 从最后一个箱子开始,逐个删除每原创 2021-04-13 18:39:17 · 139 阅读 · 0 评论 -
程序性能分析
空间复杂度该程序运行所需内存大小程序所需要的空间主要由以下部分构成:指令空间( instruction space ):是指编译之后的程序指令所需要的存储空间。数据空间( data space ):是指所有常量和变量值所需要的存储空间。它由两个部分构成: 1. 常量和简单变量所需要的存储空间。2. 动态数组和动态类实例等动态对象所需要的空间。环境栈空间( enyjronment stack space ):用来保存暂停的函数和方法在恢复运行时所需要的信息。每当一个函数被调用时, 下面原创 2021-04-09 11:58:26 · 179 阅读 · 0 评论 -
为一个二维数组分配空间
先分配行,再分配列二维数组x可以认为是:指向指针的指针 char **xtemplate <class T>void make2dArray(T ** &X, int numberOfRows, int numberOfColumns){ //创建一个二维数组 //创建行指针 x = new T * [numberOfRows] ; //为每一行分配空间 for (int i = 0; i < numberOfRows; i++) { x[i] = ne原创 2021-04-08 16:48:06 · 325 阅读 · 0 评论 -
工厂模式-
简单工厂模式属于类的创建型模型,又叫静态工厂方法模式。定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。工厂模式抽象工厂可以向客户端提供一个接口,使得客户端在不指定产品具体类型的情况下,能够创建多个产品族的产品对象。工厂方法模式针对的是一个产品等级结构,而抽象工厂模式针对的是多个产品等级结构。...原创 2021-03-19 10:35:26 · 690 阅读 · 0 评论 -
数据结构——栈(c++版)
栈原创 2021-03-18 16:58:16 · 107 阅读 · 0 评论 -
数据结构——链表(c++版)
将一个线性表插入到另一个中将所有的在线性表Lb中但不在La中的数据元素插入到La中*/void union (List *La,List Lb){ int La_len,Lb_len,i; ElemType e; /*声明与La和Lb相同的数据元素e*/ La_len = ListLength(La) ; /*求线性表的长度 */ Lb_len = ListLength (Lb) ; for( i=l; i<=Lb_len; i++ ) { GetElem(Lb, i,e)原创 2021-03-17 10:24:52 · 86 阅读 · 0 评论 -
中序遍历——非递归算法
中序遍历先走到的后访问,后走到的先访问,采用栈结构。步骤:1.如果节点有左子树,该节点入栈,否则访问该节点。2.如果节点有右子树,重复步骤1。3.如果节点没有右子树,访问完毕,根据栈顶指示退回,访问栈顶元素,并访问右子树,重复步骤1。4.如果栈为空,遍历结束。例子(c++版):#include<iostream>#include<stack>using namespace std;typedef struct Binary_tree{ int u原创 2021-03-16 21:34:30 · 3327 阅读 · 0 评论 -
双向链表(c语言版)
双链表#include<stdio.h>#include<malloc.h>#include<string.h>#include<stdlib.h>typedef struct Node{ Node* pre; Node* next;}node;typedef struct Common_list{ node head; int length;}common_list;common_list*creat_double_li原创 2021-03-13 22:00:40 · 68 阅读 · 0 评论 -
运算符重载练习
运算符重载#include <iostream>#include<string>#include<vector>#include<new>using namespace std;class Car;class Phone{private: string brand; int price; //char str[8];public: Phone(); Phone(const string &b,int pri); fr原创 2021-03-10 09:51:09 · 146 阅读 · 0 评论 -
c++类对象的例子(非标准语法;请使用 “&“ 来创建指向成员的指针,如何解决?)
Game.cpp......#include "Game.h"#include<iostream>#include<string>#include<time.h>#include<stdlib.h>#include<new>#include<typeinfo>#include<algorithm>Game::Game(){ cout << "begin to no paraments in原创 2021-03-09 11:23:16 · 817 阅读 · 0 评论 -
实现n的阶乘运算
在c++中利用递归调用实现阶乘# include<iostream>int factorial(int num){ if (num == 0) { return 1; } else { return num * factorial(num-1); }}void vivo4(){ cout << "input a number: "; int in_num; int result; while (cin>>in_num) {原创 2021-03-08 17:00:35 · 134 阅读 · 0 评论 -
c++中运算符和相对应的函数符
运算符和相应的函数符+:plus-:minus*:multiplies/:divides%:modulus-:negate==:equal_to!=:not_equal_to>:greater<:less>=:greater_equal<=:less_equal&&:logical_and||:logical_or!:logical_not...原创 2021-03-07 15:09:58 · 161 阅读 · 0 评论 -
c++中基于范围的for循环
for_each(books.begin(), books.end(), ShowReview);可将其替换为下述基于范围的for循环:for (auto x : books) ShowReview(x);根据book的类型(vector< Review>),编译器将推断出x的类型为Review,而循环将依次将books中的每个Review对象传递给ShowReview()。不同于for_each(),基于范围的for循环可修改容器的内容,诀窍是指定一个引用参数。例如,假原创 2021-03-06 10:31:50 · 151 阅读 · 0 评论 -
STL中的算法(for_each,transform)
for_each函数myPrintInt只能传入一个参数。STL提供的算法来遍历容器(包含算法头文件algorithm)。for_each从容器的起始—>结束逐个元素取出。//myPrintInt容器数据的打印方式ror_ each(v.begin(),v.end() ,myPrintInt) ;cout< <endl ;void myPrintInt(int val){ cout<<val<<" ";}transformtrans原创 2021-03-05 12:16:30 · 105 阅读 · 0 评论 -
c++集合算法
set_ intersection交集算法求两个set集合的交集注意:必须是有序序列beg1:容器1开始迭代器:end1:容器1结束迭代器beg2:容器2开始迭代器end2:容器2结束迭代器dest :目标容器开始迭代器return:容器的最后一个元素的迭代器地址set_intersection(iterator beg1, iterator end1, iterator beg2,iterator end2, iterator dest )例子:vector<int&原创 2021-03-05 17:05:48 · 148 阅读 · 0 评论 -
c++中交换/算术生成算法
swap交换两个容器的内容:swap(container c1, container c2);accumulate计算容器的元素和(求和结束加value):accumulate(iterator begin, iterator end, value);fill往容器中填充值value:v.resize(n);fill(iterator begin, iterator end, value);...原创 2021-03-05 16:31:03 · 67 阅读 · 0 评论 -
c++中拷贝替换算法
copycopy算法将容器内指定范围的元素拷贝到另一容器中@param beg容器开始迭代器@param end容器结束迭代器@param dest目标起始迭代器copy( iterator beg, iterator end, iterator dest );例子:include<iterator>vector<int> v1 ;v1.push_ _back(1) ;v1.push_ back(3) ;v1.push_ back(5) ;v1.pu原创 2021-03-05 16:22:03 · 111 阅读 · 0 评论 -
c++中排序算法
merge容器元素合并,并存储到另一个容器中,某个容器必须有序。merge算法容器元素合并,并存储到另容器中注意:两个容器必须是有序的@param peg1容器1开始迭代器@param end1容器1结束迭代器@param beg2容器2开始迭代器@param end2容器2结束迭代器@param dest目 标容器开始迭代器merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);原创 2021-03-05 16:08:13 · 106 阅读 · 0 评论 -
c++中find算法
常用的查找findfind算法查找元素@param beg容器开始迭代器@param end 容器结束迭代器@param value 查找的元素@return返回查找元素的位置,失败:返回v.end();find( iterator beg, iterator end ,value );例子:vector<int> v1 ;v1. push_back(10) ;vl. push_back(20) ;v1. push_back(30) ;v1.push_back(原创 2021-03-05 15:48:27 · 561 阅读 · 0 评论 -
c++中函数对象
谓词返回值类型为bool的普通函数或仿函数叫谓词。如果普通函数有一个参数,叫一元谓词,有两个参数,叫二元谓词。一元谓词//普通函数作为元谓词bool greaterThan20(int val){ return val>20 ;}//仿函数作为.元谓词class MyGreaterThan20{public: bool operator()(int val) { return val>20; }}for_ each(v. begin() ,v.end(原创 2021-03-05 11:23:53 · 160 阅读 · 1 评论 -
c++面试总结
指针和引用的区别:引用是给变量起别名,内部实现是指针常量(int* constref= &a),其可以简单的理解为本体指针存放的是变量的地址。引用的本质是指针常量,其指向不可修改,而指针可以改变指向。引用创建的同时必须初始化,指针创建的时候可以不必初始化。引用不能为空,指针可以为NULL。“引用变量ref"的内存单元保存的是"被引用变量a"的地址sizeof(引用) =指向变量的大小sizeof(指针)=指针本身的大小。引用使用的时候无需解引用,指针需要解引用。指针和引用"自增/自减原创 2021-03-05 11:00:45 · 230 阅读 · 1 评论 -
c++中适配器
二元适配器”元“指仿函数中的参数个数。val是for_each提供 tmp适配器1: bind2nd 或bind1st绑定参数适配器2:公共继承binary_ function(二元)适配器3:参数的萃取适配器4: 对operator( )进行const修饰class MyPrint:public binary_ function<int, int,void>{public : void operator() (int val,int tmp) const { co原创 2021-03-05 10:49:44 · 176 阅读 · 1 评论 -
c++中map容器
map容器所有元素会根据键值自动排序,每一个元素都是pair(同时拥有键值和实值),pair中:第一个元素被认为是键值,第二个元素被认为是实值。map容器的键值不可变,实值可变。常用的API:第三种:mapStu.insert(map<int,string>::value_type(111,"xxx"));例子:用第四种方法访问map容器时:cout<<m[n]<<endl;,必须保证容器中有该键值,否则会创建一个实值为空的键值。遍历方式:原创 2021-03-04 21:08:07 · 232 阅读 · 1 评论 -
c++中set容器
set容器所有元素会根据元素的键值自动排序。set容器的元素既是键值又是实值。不允许拥有两个相同的键值。不能通过迭代器更改元素,它是只读迭代器。因为会破坏排序规则。可以删除、插入。例子:set查找...原创 2021-03-04 19:29:43 · 1046 阅读 · 1 评论 -
c++中的对组
对组将一对值组成一个值,这一对值可以有不同的数据类型,两个值可以用pair的公有属性:first和second访问。创建对组:应用:原创 2021-03-04 16:56:23 · 534 阅读 · 1 评论 -
c++中的链表list容器
由于list是一个双向链表,所以迭代器必须具备前移、后移的能力,双向迭代器,不支持随机迭代器。随机迭代器和双向迭代器都支持“++”双向迭代器只支持“++”。随机迭代器支持“++”和“+n”插入和删除不会造成原有的list迭代器失效,而vector的插入操作可能造成记忆体重新配置,导致原有的迭代器全部失效。基本函数注意:函数sort(v.begin(), v.end());仅支持随机访问迭代器(不支持list)而list有自己的排序函数:sort();例子:删除自定义数据.原创 2021-03-04 11:22:32 · 200 阅读 · 5 评论 -
c++队列容器queue
先进先出,有两个口,没有迭代器,不能遍历,只能访问顶端的元素才能被访问。例子:原创 2021-03-04 08:57:51 · 129 阅读 · 2 评论 -
c++中的stack容器·
栈(stack)是一种先进后出的数据结构,但它不允许有遍历行为,不提供迭代器。只能返回栈顶元素。包含头文件< stack>原创 2021-03-04 08:47:20 · 72 阅读 · 2 评论 -
c++标准模板库STL
STLSTL中几乎所有的代码都采用了类模板和模板函数实现,这相比于传统有更好的代码重用的机会。三大组件:容器(container)、算法(algorithm)、迭代器(iterator)三者关系:算法操作数据,容器存储数据,迭代器是算法操作容器的桥梁。迭代器和容器一一对应。六大组件:容器存放数据。各种数据结构:vector,list,deque,set,map等等,从实现角度看,STL容器是一种类模板。vectorvector<int> v;vector<in原创 2021-03-04 08:32:07 · 92 阅读 · 0 评论 -
c++中deque(双端动态数组)
deque容器双端动态数组。与vector的差异:deque插入和删除为常数项时间,不会因为数据量的大小改变操作所耗时间。deque没有容量的概念。它有分段连续空间组成,由中控器连接。当前空间不足时,另开辟一段空间,并和原来的拼接在一起,像链表。而vector会在新空间开辟后删除原来的旧空间。deque构造函数例子:例子:...原创 2021-03-03 20:29:59 · 284 阅读 · 2 评论 -
c++中vector容器(维克多配98k ^_^)
维克多配98k,天下无敌^_ ^,开个玩笑,下面进入正题:vectorvector是动态空间,随着元素的加入,它会自动扩充空间容纳新元素。单端操作,尾插,尾删。vector容器的迭代器:随机访问迭代器(迭代器+n可以通过编译)。容量(capacity):空间然元素的个数。大小(size):空间实际存放元素的个数。capacity >= size。vector<int> v;v.push_back(数据);//往容器v中存放数据vector<int>.原创 2021-03-03 13:02:34 · 304 阅读 · 0 评论 -
string类
string构造字符串string类将string::npos定义为字符串的最大长度,通常为unsigned int的最大值。另外,表格中使用缩写NBTS(null-terminated string)来表示以空字符结束的字符串——传统的C字符串。string类的构造函数string(const char * s)将string对象初始化为s指向的NBTSstring(size_type n, char c)创建一个包含n个元素的string对象,其中每个元素都被初始化为字符cst原创 2021-03-02 16:15:02 · 96 阅读 · 0 评论 -
c++中valarray类的介绍
valarray类是由头文件valarray支持的,这个类用于处理数值。valarray被定义为一个类模板,以便能够处理不同的数据类型。使用valarray对象的时候的构造函数如下:double gpa[5] = {3.1, 3.5, 3.8, 2.9, 3.3};valarray<double> v1; // an array of double, size 0valarray<int> v2(8); // an array of 8 int elemen.原创 2021-03-01 16:58:08 · 923 阅读 · 0 评论 -
c++中的异常
异常处理常见的异常:除0溢出,数组下标越界,所要读取的文件不存在,空指针,内存不足等等。c++的异常一旦抛出,如果不捕获,则程序直接退出。c语言通过返回值判断,但有缺陷:1.容易忽略。2.容易和正常值混淆。abort()函数向标准错误流(cerr使用的错误流)发送消息:abnormal program termination(程序异常终止),然后终止程序。也可以使用exit()。异常机制抛出异常:throw xxx;将可能有异常的代码放在try{}中,然后用catch(抛出的异常原创 2021-03-01 16:29:43 · 1903 阅读 · 0 评论 -
c++中类型转换运算符
静态转换(static_cast)用于层次类结构中基类和派生类之间指针或引用的转换。类之间的上行转换,下行转换。可以用于基本类型转换。c语言中使用()进行强制类型转换。不能在不相关的类之间转换。格式:static_cast < type-name > (expression)例子:int a;double b;class A {};class B: public A {};class other {};A *temp = static_cast<A原创 2021-03-01 11:31:42 · 196 阅读 · 2 评论 -
c++嵌套类
嵌套类在另一个类中声明的类被称为嵌套类(nested class),包含类的对象可以使用和创建被嵌套类的对象。包含意味着将类对象作为另一个类的成员,而对类的嵌套不创建成员,是定义了一种类型。类声明的位置决定了类的作用域或可见性。class Queue{// class scope definitions// Node is a nested class definition local to this class class Node { public:原创 2021-03-01 10:05:15 · 290 阅读 · 0 评论 -
c++函数/类模板
函数模板可以重载。函数模板的参数类型不能自动转换,除非要使用模板的时候,在<>中指定类型,否则报错。普通函数的参数类型可以指自动转换。将类型作为参数传递给模板,可使编译器生成该类型的函数。格式(隐式实例化):template <typename 数据类型1,typename 数据类型2,... >void 函数名(数据类型 &a, 数据类型 &b){ ......}第1、2行属于一条语句,也可以这么写:template <type原创 2021-02-20 11:01:25 · 277 阅读 · 0 评论