自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

NL的博客

一个对技术渴望的coder

  • 博客(41)
  • 收藏
  • 关注

原创 leetcode 207 Course Shedule

典型的拓扑排序题,用BFS,重复找入读为0的节点,不断删除即可。我的做法没有建立degree数组,导致执行时间较长,下面列出我的解法和标准BFS解法。 标准BFSclass Solution{public: vector<unordered_set<int>> makegraph(int numCourses, vector<pair<int...

2018-06-30 14:07:10 125

原创 记录编程之美的一道经典题目--电话号

问题: 电话的号码盘一般可以用于输入字母,如用2可以输入a,b,c,用3可以输入d,e,f等。 对于号码5869872,可以依次输出其代表的所有字母组合。如:jtmwtpa,jtmwtpb……… 1、您能否可以根据这样的对应关系设计一个程序,尽可能快地从这些字母组合中找到一个有意义的单词来描述一个电话号码呢?如:可以用单词“computer”来描述号码26678837。分析与解法:...

2018-06-29 23:59:08 203

原创 内置数组大小分配的问题

动态内存分配相对于静态内存分配的特点:1) 静态内存分配是在编译时完成的,不需要占用CPU资源;动态分配内存是在运行时完成的,动态内存的分配与释放需要占用CPU资源; 2) 静态内存分配是在栈上分配的,动态内存是堆上分配的; 3) 动态内存分配需要指针或引用数据类型的支持,而静态内存分配不需要; 4) 静态分配内存需要在编译前确定内存块的大小,而动态分配内存不需要编译前确定内存大小...

2018-06-29 23:46:29 284

原创 static静态变量在不同位置的不同作用

static可以在很多位置发挥作用,下面我来一一讲解它们的作用。 静态局部变量 1.分配空间在静态数据栈上 2.作用域只局限于当前的函数范围内(局部) 3.生命周期为整个程序,不会随着当前的函数结束而结束 4.首次初始化时赋值生效,以后的初始化赋值自动跳过实例:void TotalTimes{ static n=10; cout<<n<<e...

2018-06-29 23:33:40 1102

原创 流迭代器iostream_iterator简介

iostream_iterator是绑定了输入输出流的迭代器,分为输入流迭代器和输出流迭代器 istream_iterator 支持动作 istream_iterator<T>it(is) istream_iterator<T>end; * it it->mem it++ it1==it2 it1!=it2 实例:istream_iterato...

2018-06-29 22:42:20 364

原创 STL泛型算法总结

<一> 查找算法(13个):判断容器中是否包含某个值 adjacent_find: 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的ForwardIterator。否则返回last。重载版本使用输入的二元操作符代替相等的判断。 binary_search: 在有序序列中查找value,找到返回true。重载的版本实用指定的比较函数对...

2018-06-29 21:59:14 576

原创 C++默认实参

默认实参就是函数里参数的缺省值,但是C++使用默认实参也不是随意的,需要遵守一定的顺序规则。void set(string name="niulei",int age=24,string sex="man"){}//通过这就是默认实参void set(string name="niulei",int age,string sex="man"){}//报错void set(st...

2018-06-28 00:48:01 1188

原创 C++的显式类型转换

C++的显式类型转换共分为四种: static_cast 任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_castint i=10;double f=static_cast<float>(i);int *p=&i;double *q=static_cast<float*>(p);其他的类型转换类似了,只要不是转换底层c...

2018-06-28 00:23:29 544

原创 template元编程初识

今天在阅读effective c++这本书的时候,接触到了TMP即模板元编程这个知识点,真心觉得发现了新大陆一样。 TMP是编写template-based C++程序并执行于编译器的过程,它可以将程序的执行从运行期转移到编译期,也就是说,编译完成之后,即可得到你想要的结果!很多传统编程做不到的事情,只有TMP可以实现,而且本来运行期才能发现的错误,也可以提前在编译期就被发现,TMP的发展,将是...

2018-06-27 23:34:59 198

原创 c++的对象模型探测(一)

面向对象编程的时候总会好奇,成员变量存放在哪里,成员函数存放在内存的哪里,static变量又存放在哪里?都是在声明的object里吗?通过阅读《深度探索C++对象模型》,该类的问题都能找到答案。 C++的设计者从简至繁是提出过几个对象模型,我在此一一介绍: 简单对象模型 第一个模型十分简单,它最大地减低了C++编译器的设计复杂度,但牺牲了空间和执行期的效率。在这个简单模型中,一个object...

2018-06-27 23:19:33 192

原创 如何将交换两个数并且不使用任何中间变量

方法一: a=a+b; b=a-b; a=a-b; 证明:b=a+b-b=a; a=a+b-b=a+b-a=b; 该方法的缺点是如果a和b都是比较大的数,a=a+b的时候就会溢出。方法二: a=a^b; b=a^b; a=a^b; 证明:异或具有对称性,假如a=a^b^b;相当于a=a;所以b=a^b^b=a;a=a^b^a=b; 异或的对成性即是连续异或两个相同的数相...

2018-06-27 23:03:33 642

原创 日常刷题Leetcode.174 Dungeon Game

The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. The dungeon consists of M x N rooms laid out in a 2D grid. Our valiant knight (K) was initially pos...

2018-06-26 23:55:29 109

原创 c++代码优化办法

代码先上为敬void combine5(double data[],int length){double sum = 0.0;for(int i=0;i<length;i++){sum *= data[i];}cout<<sum<<endl;}void combine6(double data[],int length){double sum...

2018-06-25 23:56:06 131

原创 探索编译器的内存对齐方式

数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍。DWORD数据的内存起始地址能被4除尽,WORD数 据的内存起始地址能被2除尽。x86 CPU能直接访问对齐的数据,当它试图访问一个未对齐的数据时,会在内部进行一系列 的调整。这些调整对于程序来说是透明的,但是会降低运行速度,所以编译器在编译程序时会尽量保证数据对齐。同样一 段代码,我们来看看用VC、Dev C++和LCC这3个不同的...

2018-06-24 22:08:59 403

原创 模板参数中的typename的用法

首先在template的声明式中,class和typename有什么不同呢?答案是没有什么不同。 比如template<class T> persontemplate<typename T> person这两种声明方式我们在声明模板参数时,视其为等价的,不过老程序员可能更喜欢class,因为它在过去是主流用法,而且简短,少打几个字,可提高编程速度。但是本人比...

2018-06-24 21:51:00 1100

转载 C/C++如何实现随机数

一、引言 学习 C 语言已经很久了,工作之后便投入了 C++ 的怀抱。一直也没有遇到过随机数的问题,最近工作刚好遇到了,这里也好奇了下,C 语言有 rand 函数来实现随机数,那么 C++ 呢?二、C++并未对随机数作专门的处理 通过翻阅了 C++ 在线手册,我很遗憾的发现,C++ 并未对随机数的相关函数进行专门的封装,而是直接调用了 头文件作为对于 C 语言的兼容。那么其实在这里,C ...

2018-06-24 18:49:32 1970

原创 日常刷题 leetcode 79. Word Search

Given a 2D board and a word, find if the word exists in the grid.The word can be constructed from letters of sequentially adjacent cell, where “adjacent” cells are those horizontally or vertically n...

2018-06-24 00:24:00 181

原创 日常刷题 leetcode 78. Subsets

Given a set of distinct integers, nums, return all possible subsets (the power set). Example:Input: nums = [1,2,3] Output: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [...

2018-06-23 21:54:41 116

原创 windows下的IOCP

对应Linux下的epoll,windows下也有实现IO复用的方法,那就是IOCP,又叫重叠IO,其实和异步IO没什么区别,《TCPIP网络编程》这本书也没有对重叠IP和异步IO做明确的区分。 首先,创建重叠IO的套接字。SOKET WSAocket(int af,int type,int protocol,LPWSAPROTOCOL_INFO lpProtocolInfo,GROUP g...

2018-06-23 17:44:09 2151

原创 linux下的epoll函数

epoll是TCP/IP网络编程的IO服用方法之中一种优于select的函数,相比select,它有两个优点: 1.无需编写以监视状态变化为目的的针对所有文件描述符的循环语句。 2.调用对应于select函数的epoll_wait函数时无需每次传递监视对象信息。 下面介绍epoll服务器端实现中需要的三个函数,希望各位结合epoll函数的优点理解这些函数的功能。 epoll_create:...

2018-06-23 16:48:18 579

转载 C++虚函数继承与虚继承

虚函数继承和虚继承是完全不同的两个概念。虚函数继承是解决多态性的,当用基类指针指向派生类对象的时候,基类指针调用虚函数的时候会自动调用派生类的虚函数,这就是多态性,也叫动态编联。虚继承就是为了节约内存,他是多重继承中的特有的概念。适用于菱形继承形式。比如B继承于A、C继承于A、D继承于B和C,显然D会继承两次A(图1)。因此,为了节省空间,可以将B、C对A的继承定义为虚拟继承,而A就成...

2018-06-23 16:24:14 396

原创 c++正则表达式总结

C++的正则表达式相比其他语言的用法要复杂一些,尤其比perl复杂的的多,但是万变不离其宗,其本质内容还是保持一致的,下面介绍一下C++正则表达式的结构: 正则表达式结构按字符串宽窄和常量非常量可以分为四族:string    regex、smatch、ssub_match 、sregex_iteratorconst char* regex、cmatch、csub_match...

2018-06-21 13:19:54 1021

转载 指针和引用的区别

(1)非空区别。在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让他指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针要高。 (2)合法性...

2018-06-21 10:35:58 64

原创 const与#define相比有什么不同

C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点: (1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。 (2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。在C++ 程...

2018-06-21 10:24:45 188

原创 leetcode.71 Simplify Path (精)

题目要求 Given an absolute path for a file (Unix-style), simplify it.For example, path = “/home/”, => “/home” path = “/a/./b/../../c/”, => “/c”Corner Cases:Did you consider the case where p...

2018-06-20 00:55:11 153

原创 数组分割算法

今天读编程之美遇到一道题,跟着其中的算法思路进行了推理思考,让我重新温习了高中的数学知识,梳理了一边自己的数学思维,颇有感触,不记可惜,特发此文。 题意如下:  有一个没有排序,元素个数为2n的正整数数组,要求:如何能把这个数组分割为元素个数为n的两个数组,并使两个子数组的和最接近?  遇到任何题目,我们都应该将思路从简至繁,复杂度从繁至简地思考解决办法,即,先找傻子都能想到的办法,然后步步...

2018-06-18 23:57:16 939

原创 leetcode 67. Add Binary

题干 Given two binary strings, return their sum (also a binary string). The input strings are both non-empty and contains only characters 1 or 0. 题意 给两个字符串表示的二进制数字,得出他们相加的二进制结果,并返回。 一开始我用的是这种解法,将字符...

2018-06-17 12:29:39 87

原创 虚函数的一种替代方案

虚函数的目的是实现对象的动态绑定,但是有些情况下,可能换一种替代方案,可能会使类的设计更加稳定,易用,下面列出一个我认为很棒的虚函数的替代方案。 使用non-virtual interface(NVI)手法,它以public non-virtual 成员函数包裹较低访问性的virtual函数:class A{public: int getVal(){ return ...

2018-06-16 22:43:37 646

原创 求数组中最长递增子序列

 虚函数总是在派生类中被改写,这种写法被称为“override”。  override是指派生类重写基类的虚函数,就像我们前面在B类中重写了A类中的foo()函数.重写的函数必须有一致的参数表和返回值(C++标准允许返回值不同的情况,但是很少有编译器支持这个特性)。Override这个单词好像一直没有什么合适的中文词汇来对应。有人译为“覆盖”,还贴切一些。  overload约定俗称地被翻译为...

2018-06-13 10:59:07 227

原创 异常安全函数的三个等级

异常安全函数提供以下三个保证之一: 基本承诺:如果异常被抛出,程序内的任何事物仍然保持在有效。没有任何对象或数据结构会因此而败坏,所有对象都处于一种内部前后一致的状态(例如所有的class约束条件都继续获得满足)。然而程序的现实状态恐怕不可预料,举个例子,在一个成员函数调用发生异常后,没有达到预期的状态,也没有恢复到调用之前的状态,而是随机选择了一种缺省的状态,但客户无法预料是哪一种情况。 强...

2018-06-13 10:35:12 478

原创 多重继承的优点和缺陷

多重继承在语言上并没有什么很严重的问题,但是标准本身只对语义做了规定,而对编译器的细节没有做规定。所以在使用时(即使是继承),最好不要对内存布局等有什么假设。此类的问题还有虚析构函数等。为了避免由此带来的复杂性,通常推荐使用复合。但是,在《C++设计新思维》(Andrei Alexandrescu)一书中对多重继承和模板有极为精彩的运用。 (1)多重继承本身并没有问题,如果运用得当可以收到事半功...

2018-06-12 11:54:28 5190

原创 派生类的三种继承方式小结

公有继承、私有继承、保护继承是常用的3种继承方式。 1.公有继承方式  基类成员对其对象的可见性与一般类及其对象的可见性相同,公有成员可见,其他成员不可见。这里保护成员与私有成员相同。  基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员可见,基类的公有成员和保护成员作为派生类的成员时,他们都保持原有的状态;基类的私有成员不可见,基类的私有成员仍然是私有的,派生类不可访问基类中的...

2018-06-12 10:19:10 8787

原创 c++仿函数概述

所谓仿函数,是一个定义了operator()的对象。下面这个例子:FunctionObjectType fo;...fo(...);其中表达式fo()系调用仿函数fo的operator(),而非调用函数fo()。 你可以将仿函数视为一般函数,只不过用的是一种更复杂的撰写手段:并非将所有语句放在函数体中:void fo(){ *statements*}而是...

2018-06-11 17:19:36 377

原创 c++特例化和实例化

关于c++的特例化和实例化,这两个名词的名字就差不多,含义也容易被搞混,其实两者差别还是比较大的。 实例化(instantiation): 模板在调用之前都没有生成真正的代码,调用之后才会生成代码,这个生成代码的过程就叫做实例化,比如:template<typename T>void print(T obj){ cout<<obj;}/

2018-06-10 23:57:34 2231

原创 关于对STL容器,迭代器,泛型算法,内存配置的总结性思考

源码之前,了无秘密。前两个月读完了STL源码剖析这本书,深感侯捷大师的深厚功底,使我对STL的编程思维有了深切的体会,当时及时记录下了自己的所思所想,今天将它分享给大家,希望大家能从中受益,也希望大神能给我一些指教。发这篇博客的原因是我有一天做了一个很有趣的实验:vector<bool>vec1(8,true);vector<char>vec2(16,1);ve...

2018-06-09 23:29:31 245 2

原创 c++面向对象编程中封装的重要性

C++中有个不成文的规定(其实在c++effective中已经成文),就是要将成员变量声明为private,这样做的好处有三点: 1.提高语法的一致性,客户在访问class成员的时候不需要思考是否要带括号,统一带括号访问,节省思考时间。 2.提升class对成员变量的访问控制精度,如果你的成员变量声明为public,这样所有的用户都能访问到它,但如果你声明为private,你就可以通过实现成员...

2018-06-09 15:00:57 2591

原创 为什么传递类类型参数时尽量用引用传递

对这个问题,以前只是笼统地觉得值传递要现构造参数,性能肯定比引用传递差,可今天读过effective c++ 才知道具体差在了哪里。 比如struct A{ A(); ~A(); string name; string sex;}struct B:public A{ B(); ~B(); string addr; strin...

2018-06-08 21:13:17 3859

原创 日常刷题 Leetcode 77. Combinations

日常刷题,今天做了这道经典的递归题目,感觉非常具有代表性,特此将自己的思路以及代码发表出来,留作以后做类似题目的参考,以及对大家的分享。 题目描述: Given two integers n and k, return all possible combinations of k numbers out of 1 … n. Example: Input: n = 4, k = 2 Out...

2018-06-07 23:26:33 452

原创 关于c++内置数组和数组指针的总结

内置数组和数组指针完全是两种类型,比如int *p=new int[4];for(auto i:p){    cout<<i;} 就会出错,而int p[4]={};for(auto i:p){    cout<<i;}就不会出错。原因是第二个p是数组类型,允许begin函数取位置,第一个p是指针,不能用Begin函数取位置。一开始读c++primer时,书中说在对于数组p...

2018-06-07 13:23:38 351

原创 为什么C++内置类型的局部变量不能默认初始化

C++有个人所共知的特性,就是它的内置类型是无法在局部区域内默认初始化的。如下所示int k;int main(){ int m; cout<<k<<endl; cout<<m<<endl; return 0;}编译器会直接报错错误 C4700 使用了未初始化的局部变量“m”c++primer上...

2018-06-07 12:56:17 3174 5

空空如也

空空如也

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

TA关注的人

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