暂无个人介绍
同样可以采用类似于上面第一种题的做法,即将一个栈中的元素全部倒过来,用于存储pop后原栈中的数据。然后将新插的元素压入栈后,再将这个存储栈倒回来。
它报错的原因是说怀疑这个scanf函数不安全。因为VS是一款功能强大的IDE,它的语法检查、控制台环境检查机制太严格了,你从键盘中输入这个事情在它看来是一种不安全的操作。所以它才会报错。它的建议是用scanf_s或者 _CRT_SECURE_NO_WARNINGS(即crt secure no warnning,控制台不报警告)
如果只是系统内部, 服务器和服务器之间进行通信, 只有少数的几个连接, 这种情况下用epoll就并不合适.。
等某事件就绪。即有数据可读或者可写的时候,或者达到一定的“水位线”的时候。
在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)
子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换)(上面说到过)。
你在应用层上想要发送一个信息,但是我在底层可能是通过发送多次、甚至有触发了超时重传等等。而站在用户的角度呢,你不用去管它,我传输层不管怎么发,反正最终把你的数据发出去就可以了。也就是说,应用层的传输和底层传输层的并不是一对一、一一对应的关系。
本节我们来介绍TCP连接的建立和断开。我们主要介绍两个过程、两个状态。
客户端认为连接已经建立成功了,所以就正常发数据。但是这个时候服务器并未建立连接,在收到数据之后,会向客户端发送一个含有RST的报文(reset),即希望客户端重新建立连接。
大家应该都知道http和https的区别,区别很简单,主要就是在https是采用了加密协议的,而http完全是在网络上裸奔的。而我们现在几乎所有的连接都用的是https
协议是一种 "约定". socket api的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接收的。更准确点来说,收发是按照比特位的形式进行的。
这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。
关于非阻塞式等待的用法,我们可以使用轮回询问的方式,即使用循环的方式,不断的询问子进程此时是否退出。而非阻塞式的等待使得父进程在子进程运行时,自己可以不用傻傻的等着,也可以做自己的事情。
到目前为止,我们也已经讲解了几个例题了。我们在最后,就不再为大家继续讲解新的例题了。理由很简单,因为动态规划的题目是有规律可循的,可以将其按照知识点,或者是按照题型归类。而笔者将会在下一篇姊妹篇中,为大家带来按照知识点来讲解的动态规划。而动态规划的提醒大家可以通过多多做一些练习,并将其加以总结,就会对这一块有着越来越深刻的印象和认识。本篇文章的定位只是帮助大家认识DP,将大家领进门,还远远没有能够达到能够熟练掌握的地步。但是大家至少在看完本篇文章之后,能够对所有的DP问题有着清晰的架构了,并且在之后看题解的过程中、做题的过程中也会有自己的一些套路和思考在了。不至于一窍不通、是一个门外汉了。
对于C/C++的编程环境来说,目前我们所接触到的、所用到的,除了vim以外,大众用的、尤其是学生群体用的主要是有三种。
我们首先是要去熟悉单调栈这种结构,熟悉后,我们遇到问题的时候就只需要将原来包装的问题拆分,层层拆分后发现有用单调栈的这种需求,便可以瞬间联想到并去使用。
再一个进程task_struct中,会有一个files* 类型的指针,其指向的正是以恶搞file_struct的结构体。而在这么一个结构体里面,又存在着一个存储着file*的指针数组,数组的下标从0开始,一直到n(n实际上也是有上限的)。每打开一个新的文件之后。
本节内容,我们将详细讲解Linux线程的有关知识,并为同学们铺垫多线程的有关知识。
从system call(系统调用结构)开始往下,都是属于OS和硬件的范畴,我们一般的程序员所进行的开发,通常都是在用户层。(这个我们后面还会具体说到)。
号的产生不是以传输数据为目的的,而是以通知某个事情是否要发生为目的。
可以用同样的方式来实现,就是将构造函数私有化,然后让创建类的时候只能通过一个接口函数来实现,而在这个接口函数中我们将其创建在栈上。
我们前面所说的map和set还是有点区别的,首先最大的区别就是其是无序的,这一点从其名字上就可以看出。
们需要知道的是,Map和Set的底层都是红黑树。
每一个关键码key,都有与之对应的值Value,即<Key, Value>的键值对。该种方式在现实生活中非常常见:比如英汉词典就是英文与中文的对应关系,通过英文可以快速找到与其对应的中文,英文单词与其对应的中文<word, chinese>就构成一种键值对;
关于IO流的知识,我们在这里只是简单地提一下,以及在代码书写过程当中需要注意的问题。关于其具体的、详细的知识,我们放在Linux操作系统中来介绍。
如果这里的地址是物理地址,就是说是真正硬件存储器上的地址,那我拿到了一个地址,它对应的值到底是10,还是20?
在说冯诺依曼体系结构之前,我们先来了解这么一个常识:我们的电脑或者手机,总的来说,其体系结构都是由 软件+硬件 构成。
会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
翻了翻网页,发现说的还是很长、很大,说到底,就是对于一个源代码,对外免费公开,任何人都有使用、传播、商业利用等等的权利,唯一的要求,就是当你在更新它的代码的时候,必须同样遵循开源精神,即公开出来,让别人能够看到并且使用。
头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是必vector高的。
Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本--所有STL实现版本的始祖。
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。
C语言是结构化和模块化的语言,适合处理较小规模的程序。 对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。 为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(objectoriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。
重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
其按照我们想要的方式排列了出来。由于我们在向下调整算法里的if给的是 a[child + 1] > a[child]和a[child] > a[parent]才交换,那么我们得到的就是一个大堆。
对于栈和队列,我们在这里只是把 其底层的原理简单的说一下,等到C++说到STL的时候,我们还会详细地说。
可以看到 ,我如果要吧黑球插入到白球里面,显然,我要把7号位的球移到8号位,5号位的球移到6号位...然后最后才能把2号位的求插进去。如果有N个数据,那么它的算法的时间复杂度达到了O(N)!
这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
在开辟数组的过程中,其必须是一个定长的数组,就是在开辟空间的过程中就要指定大小;并且空间开辟的大小是固定的。
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
源字符串必须以'\0'结束。 会将源字符串中的'\0'拷贝到目标空间。 目标空间必须足够大,以确保能存放源字符串。 目标空间必须可变。
我们在现在,其实已经比较清楚函数是怎么样运行的了,包括怎样传参 、函数调用等等。但是呢,这样也只是理解到了会用的地步。
const int* 是指向一个常量整数的指针,所以说,const int*所修饰的指针变量,其指针变量本身(即指向元素的地址)是可以被修改的,但是其指针所指向的值是不允许被修改的。
我们把计算机中的内存看作一条长街上的一排房屋。比如繁华大道上的多少多少号。每个房子可以容纳数据,并通过多少多少号来标识。
加法或者减法都是双目操作符,就是必须要求有两个操作对象才能够用它,这也很好理解,加法、减法要两个数才能加减对吧。
初始化函数,简而言之,我们想要它能够将我的这个顺序表初始化。
在C99之前,这种写法是不允许的,而在C99之后,这种写法是允许的。而我们vs编译器的编译环境并不能很好的支持C99的语法,如果我们在gcc编译器或者其他对新语法更加支持的编译器下,这种写法是可以的。
数据结构,Data Structure, 指的就是计算机存储、组织数据的一种方式。并且可以理解为,这些数据的元素间有着特定关系。而这些数据包含其特定关系的集合,就叫数据结构。
我们还需要知道递归的价值:函数递归会使用大量的空间,因为它会不停地调用某一个函数,但是在递归的时候,内存中为上一级函数开辟的空间并不会被销毁,因为该函数还没有结束。所以,在递归下一级函数的时候,内存就必须要为其在新的地方重新开辟一块空间来。