自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 ACM:最短路,dijkstra,邻接表的建立,使用邻接表跟优先队列的dijkstra,Bellman-Ford,Floyd。。

(一)所有边权均为正,不管有没有环,

2014-06-30 22:17:03 2238

原创 Effective C++:条款34:区分接口继承和实现继承

(一)class Shape { public: virtual void draw() const = 0; virtual void error(const string& msg); int objectID() const; }; class Rectangle : public Shape {...}; class Ellipse : publi

2014-06-28 12:49:37 739

原创 ACM:最小生成树,kruskal && prim,并查集

题目:输入顶点数目,边的数目,输入每条边的两个顶点编号还有每条边的权值,求最小生成树,输出最小生成树的权值。。注意:prim算法适合稠密图,其时间复杂度为O(n^2),其时间复杂度与边得数目无关,而kruskal算法的时间复杂度为O(eloge)跟边的数目有关,适合稀疏图。kruskal----归并边;prim----归并点方法一:kruskal,克鲁斯卡尔

2014-06-27 22:05:29 1041

原创 ACM:树的变换,根据表达式建立表达式树

题目:输入一个表达式,建立一个表达式树!分析:找到最后计算的运算符(它是整棵表达式树的根),然后递归处理!            在代码中,只有当p==0的时候,才考虑这个运算符,因为括号里的运算符一定不是最后计算的,应当忽略!    由于加减跟乘除都是左结合的,最后一个运算符才是最后计算的,所以用两个变量c1跟c2分别记录在括号外面的“最右”出现的加减号和乘除号。

2014-06-27 18:09:14 1496

原创 ACM:树的变换,无根树转有根树

题目:输入一个n个节点的无根树的各条边,并指定一个根节点,要求把该树转化为有根树,输出各个节点的父亲编号。分析:分析在代码的注释中!#include #include using namespace std;const int MAXN = 1000;int n, p[MAXN];vector G[MAXN];void dfs(int u, int fa

2014-06-27 16:52:20 3712

原创 Effective C++:条款33:避免遮掩继承而来的名称

(一)下面这段代码:int x; void someFunc(){ double x; //local variable std::cin>>x; //read a new value to local x}这个指涉的是local变量x,而不是global变量x,因为内存作用域会的名称遮掩外围作用域的名称。当编译器处于someFunc的作用域内并遭遇

2014-06-27 12:30:35 852

原创 Effective C++:条款32:确定你的public继承塑模出is-a关系

(一)public继承意味着“is-a”关系。它的意思是:如果B以public形式继承自A,那么B类型对象肯定是一个A对象,反之不成立。A是B的一种抽象,B是A的特例。任何使用A的地方,都能使用B。(二)public继承意味着“is a”(是一种)关系:(1)任何一个继承类对象也是一个基类对象;(2)任何可以出现基类对象的地方也可以出现一个继承类对象(例如函数的

2014-06-26 12:07:25 812

原创 Effective C++:条款31:将文件间的编译依存关系将至最低

(一)假设你对C++程序的某个class实现文件做了些轻微改变,修改的不是接口,而是实现,而且只改private成分。然后重新建置这个程序,并预计只花数秒就好,当按下“Build”或键入make,会大吃一惊,因为你意识到整个世界都被重新编译和链接了!问题是在C++并没有把“将接口从实现中分离”做得很好。避免陷入这种窘境的一种有效的方法就是本条款要提出的内容:将文件间的编译依存关系降至最低.

2014-06-25 22:31:42 783

原创 Effective C++:条款30:透彻了解inlining的里里外外

(一)inline函数,可以调用它们而又不需蒙受函数调用所招致的额外开销。inline函数背后的整体观念是,将“对此函数的每一个调用”都已函数本体替换之,这样做可能增加你的目标码(object code)大小。在内存有限的机器上,过度inline会造成程序体积太大,导致换页行为,降低缓存的命中率等一些带来效率损失的行为。如果inline函数的本体很小,编译器针对“函数本体”所产生的码可能比

2014-06-25 16:40:38 793

原创 C++实现TCP通信。。

(一)服务器端:(1)#include #include #include using namespace std;int main(int argc, char* argv[]){ //加载套接字库 WORD wVersionRequested;//WinSock库的版本号 WSADATA wsaData; int err; wVersionRequest

2014-06-24 22:39:48 4780

原创 C++实现UDP通信。。

(一)服务器端:(1)void main(){ WORD wVersionRequested;//定义一个word类型的变量 WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData

2014-06-24 22:23:04 2142

原创 Effective C++:条款29:为“异常安全”而努力是值得的

(一)先看下面这些代码:class PrettyMenu {public: void changeBackground(istream& imgSrc);private: Mutex mutex; //由于这个class希望用于多线程环境,所以它有这个互斥器作为并发控制之用 Image* bgImage; //目前的背景图像 int imageChan

2014-06-24 18:11:04 1071

原创 Effective C++:条款28:避免返回 handles 指向对象内部成员

(一)有时候为了让一个对象尽量小,可以把数据放在另外一个辅助的struct中,然后再让一个类去指向它。看下面的代码:class Point {public: Point(int x, int y); void setX(int newVal); void setY(int newVal);};struct RectData { Point ulhc; Point lrhc

2014-06-24 09:48:20 876

原创 ACM:图的BFS,走迷宫

题目:一个网格迷宫由n行m列的单元格组成,每个单元格要么是空地(用1表示),要么是障碍物(用0来表示)。你的任务是找一条从起点到终点的最短移动序列,其中UDLR分别表示往上、下、左、右移动到相邻单元格。任何时候都不能在障碍格中,也不能走到迷宫之外。起点和终点保证是空地。分析:图的BFS。#include #include #include using namesp

2014-06-23 21:48:26 2568 1

原创 Effective C++:条款27:尽量少做转型动作

(一)C风格旧式转型:(T)expressionT(expression)(二)C++提供四种新式转型:(1)const_cast(expression):去除表达式的常量性,是C++中唯一能做此操作的转型操作符。(2)dynamic_cast(expression):主要用来执行“安全向下转型”,即用来决定某对象是否归属继承体系中的某个类型。它是唯一无法由旧式

2014-06-23 20:19:40 834

原创 Effective C++:条款26:尽可能延后变量定义式的出现时间

(一)那么当程序的控制流到达这个变量定义时,变承受构造成本;当变量离开作用域时,便承受析构成本。string encryptPassword(const std::string& password) { using namespace std; string encrypted; if(password.length() < MinimumPasswordLengt) { t

2014-06-23 15:48:41 731

原创 Effective C++:条款25:考虑写出一个不抛异常的swap函数

(一)缺省情况下swap动作可由标准程序库提供的swap算法完成:namespace std { template void swap(T& a, T& b) { T temp(a); a = b; b = temp; } }这个函数是异常安全性编程的核心,并且是用来处理自我赋值可能性的一个常见机

2014-06-23 14:52:12 978

原创 ACM:图的DFS,黑白图像

题目:输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数。如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块。输入:第一行输入一个整数n(n输出:输出有多少个八连块,以及每个块的面积。一个方格的面积为1。分析:把图片最外层扩展开来,在最外面加一层白色的框框。。设置一个数组来存储每个八连块的面积。。DFS递归调用每一个黑色的方块。。DFS的最

2014-06-22 22:36:10 1581

原创 Effective C++:条款24:若所有参数皆需类型转换,请为此采用non-member函数

(一)假设一个class用来表现有理数,允许整数“隐式转换为”有理数似乎很合理。class Rational{ public: Rational(int numerator = 0, int denominator = 1); //刻意不为explicit;允许int-to-Rational隐式转换 int numerator()const; int den

2014-06-22 21:34:26 765

原创 Effective C++:条款23:宁以non-member、non-friend替换member函数

(一)有个class来表示网页浏览器:class WebBrowser { public: void clearChache(); void clearHistory(); void removeCookies(); };许多用户会想一整个执行所有这些动作,因此WebBrowser也提供这样一个函数:clearEverythingclass

2014-06-19 15:34:56 750

原创 Effective C++:条款22:将成员变量声明为private

(一)为什么不采用public成员变量(1)首先,从语法一致性考虑,客户唯一能访问对象的方法就是通过成员函数,客户不必考虑是否该记住使用小括号()。(2)其次,使用函数可以让我们对成员变量的处理有更精确的控制。如果我们令成员变量为public,那么每个人都可以读写它!但如果我们以函数取得或设定其值,我们就可以实现出“不准访问”、“只读访问”以及“读写访问”,我们甚至可以实现“惟写访

2014-06-19 13:13:29 890

原创 ACM:动态规划,01背包问题

题目:有n件物品和一个容量为C的背包。(每种物品均只有一件)第i件物品的体积是v[i],重量是w[i]。选一些物品装到这个背包中,使得背包内物品在总体积不超过C的前提下重量尽量大。解法:两种思路:第一种:d(i, j)表示“把第i,i+1,i+2,...n个物品装到容量为j的背包中的接下来的最大总重量”。            d(i, j) = max{d(i+1, j),

2014-06-19 11:09:27 1803

原创 Effective C++:条款21:必须返回对象时别妄想返回其reference

(一)一定要避免传递一些references去指向其实并不存在的对象。看下面这个类:class Rational { public: Rational(int numerator = 0, int denominator = 1); private: int n, d; friend const Rational operator*(const Rat

2014-06-15 19:54:33 673

原创 Effective C++:条款20:宁以 pass-by-reference-to-const替换pass-by-value

(一)调用函数的时候如果传递参数pass-by-value,那么函数参数都是以实际实参的副本为初值,调用端所获得的亦是函数返回值的一个复件。看下面代码:class Person { public: Person(); virtual ~Person(); private: string name; string address; };

2014-06-15 14:19:13 916

原创 ACM:动态规划,物品无限的背包问题(完全背包问题)

题目:有n种物品,每种物品都有无限件可用。第i种物品的体积是vi,重量是wi。选一些物品装到一个容量为C的背包中,使得背包内物品在总体积不超过C的前提下重量尽量大。分析,完全背包问题,相对于上上篇文章的硬币问题,只是由DAG上的无权图变成了这里的DAG上的带权图!输出最后满足体积不超过背包容量的条件下,背包中的最大重量。代码:#include #include using

2014-06-11 22:18:49 4169 1

原创 ACM:贪心法:乘船问题。

题目:有n个人,第i个人的重量为wi,每艘船的最大载重量均为C,且最多只能乘两个人。用最少的船装载所有人。分析:贪心法!           考虑最轻的人i,他应该和谁一起坐呢?如果每个人都无法和他一起坐船,那么唯一的方案就是每个人坐一艘船!           否则,他应该选择能和他一起坐船的人中最重的一个j。           这样的方法是贪心的!因为:它只是让“眼前”的浪费

2014-06-11 21:54:56 2815

原创 Effective C++:条款18:让接口容易被正确使用,不易被误用

(一)看下面这个例子:class Date { public: Date(int month, int day, int year);};很有可能引起下面这两个错误:(1)他们也许会以错误的次序传递参数,如:Date d(30, 3, 1995); (2)他们可能传递一个无效的月份或天数,如:Date d(2, 30, 1995); 许多像这类客户端错误。

2014-06-11 20:27:53 788

原创 Effective C++:条款17:以独立语句将newed对象置入智能指针

(一)假设有下面这两个函数:int priority();void processWidget(tr1::shared_ptr pw, int priority);现在这样调用它:processWidget(new Widget, priority());但是!上面这种调用不能通过编译,因为tr1::shared_ptr构造函数需要一个原始指针,但是,这个构造函数是expl

2014-06-11 17:57:10 737

原创 Effective C++:条款16:成对使用new和delete时要采取相同形式

(一)先看下面的代码:string* stringArray = new std::string[100];...delete stringArray;这样的做法是错误的,因为stringArray所含的100个string对象中的99个可能并没有被适当地删除,因为它们的析构函数很可能没有被调用。 (二)使用new时发生的事情:(1)内存被分配出来;(2)针

2014-06-11 16:22:08 701

原创 Effective C++:条款15:在资源管理类提供对原始资源的访问

(一)下面代码:tr1::shared_ptr pInv(createInvestment());int daysHeld(const Investment* pi);我们要调用daysHeld函数的话,就必须传递一个Investment指针,但是我们现在只有pInv对象,所以我们需要一个函数可将RAII class(本例为tr1::shared_ptr)对象转换为其所内含之原始资

2014-06-11 15:58:49 800

原创 Effective C++:条款14:在资源管理类中小copying行为

(一)上一条款说的auto_ptr和tr1::share_ptr适合于heap-based的资源,然而并不是所有资源都是heap-based的。换句话说并不是tr1::shared_ptr 和 auto_ptr 永远适合做为资源的管理者。所以有时难免还是需要实现自己的资源管理类型。假设Mutex类型通过lock和unlock两组函数进行互斥器的锁定和解锁,可能我们希望和auto_ptr一样

2014-06-11 13:15:39 775

原创 Effective C++:条款13:以对象管理资源

(一)先看下面这段看起来貌似很不错的代码:class Investment {...};Investment* createInevstment(); //factory函数void f() { Investment* pInv = createInvestment(); ...; delete pInv; //释放pInv所指的对象}但是存在不安全。因

2014-06-10 14:54:29 708

原创 Effective C++:条款12:复制对象时勿忘其每一个成分

(一)一个继承体系的声明:class Date {...};class Customer {public: ...private: string name; Date lastTransaction;};class PriorityCustomer : public Customer {public: PriorityCustomer(const

2014-06-10 13:34:14 805

原创 ACM:DAG上的动态规划------硬币问题

题目:有n种硬币,面值分别为V1,V2,...Vn,每种都有无限多。给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的最小值和最大值!分析:我们把每种面值看作一个点!表示“还需要凑足的面值”,初始状态为S,目标状态为0。那么若当前状态在i,每使用一个硬币j,状态便转移到i-Vj。 代码:记忆化搜索:#include #include using n

2014-06-10 12:25:20 3280 2

原创 Effective C++:条款11:在operator= 中处理“自我赋值”。

(一)注意自我赋值,因为有“别名”的存在。实际上两个对象只要来自于同一个继承体系,他们甚至不需要声明为相同类型就可能造成“别名”,因为一个base class的reference或pointer可以指向一个derived class对象(多态)。class Base {...};class Derived : public Base {...};void doSomething(c

2014-06-09 16:28:01 750

原创 数据结构:图论:欧拉回路!一笔画问题

从无向图中的一个结点出发走出一条道路,每条边恰好经过一次。这样的路线称为欧拉道路。奇点的概念:一个点的度数为奇数的时候,这个点就称为:奇点。无向图中结论:不难发现,在欧拉道路中,除了起点跟终点,其他所有点的度数都应该是偶数!如果一个无向图是连通的,且最多只有两个奇点,则一定存在欧拉道路。如果有两个奇点,则必须从其中一个出发,然后从另外一个终止。如果不存在奇点,则可以从任意点

2014-06-09 14:47:43 2231

原创 数据结构:图论:拓扑排序! 两种方法!

拓扑排序:(1)由偏序变成全序的过程!直观的说,偏序指集合中仅有部分成员之间可比较!而全序指集合中全体成员之间均可比较!                    (2)将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。数据结构中进行拓扑排序的方法:方法一:(1)在有向图中选一个没有前驱的顶点且输出之!(2)从图中删

2014-06-09 14:11:51 1174

原创 数据结构:树的遍历!按先序遍历创建一棵树,分别以先序、中序、后序遍历输出

题目:树的遍历!按先序遍历创建一棵树,分别以先序、中序、后序遍历输出 样例输入A B # D # # C E # # F # #

2014-06-08 13:19:23 1954

原创 Effective C++:条款10:令operator=返回一个reference to *this。

(一)看下面的连锁赋值式:int x, y, z;x = y = z = 15;在编译器里面实际会被解析为:x = (y = (z = 15));能实现连锁赋值的原因是我们的赋值操作符返回的是一个reference to *this!指向操作符的左侧实参!class Widget {public: ... Widget& operator=(const Wi

2014-06-08 12:56:02 551

原创 数据结构:树的BFS,树的层次遍历! 按先序遍历创建一棵树,然后以层次遍历输出。

按先序遍历创建一棵树,以层次遍历输出样例输入A B # D # # C E # # F # #样例输出LevelOrder: A B C D E F  代码:#include #include using namespace std;struct node { //表示一个树上的节点 char ch; nod

2014-06-08 12:37:49 3896

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除