策略模式是组件协作的一种,是一种面向对象原则下的产物传统的组件协作是根据过程式语言而形成的,但是这种会破坏数据之间的关联性且不易维护int main() { int n = 9; if (n == 1) {} // 条件判断 else {} return 0;}因此在面向对象的原则下采用类的继承特性,具体问题用具体的策略#include <iostream>using std::cout;using std::endl;class Animal {public:
此意思是对内存进行编号。如下若某计算机字长为32位,内存容量为2GB,按字编址,则可编址范围为多少?计算机字长为32位,则一个计算机字长度为32位内存容量为2GB,即内存容量为2Gx1B按字编址,则在内存中内存编号主要是由一个字进行编号的则可编址范围应该以32位为间隔即2GB/32=512MB...
C语言的栈实现起来实在麻烦,而且只是逻辑上的删除等等操作,我不太喜欢,所以在此直接用C++的栈了。(等以后啥时候用得上再学C的自造栈吧嘿嘿嘿)C++的stack是C++的标准库之一,相关了解可以在《STL源码解析》一本书中寻得,当然,如果只是用的话,不必知道这些底层的分配器,迭代器,容器,算法,泛型等等#include <stack>直接贴上栈的操作吧// 构造函数stack<T> stk; // stack采用模板类实现,stack对象的默认构造形式stack(co
树无疑是数据结构中占着举足轻重的地位,因此需要细嚼慢咽。比如满二叉树,完全二叉树,线索二叉树,遍历二叉树,AVL树(平衡二叉树),BST树(二叉排序树),B树,B+树,赫夫曼树,堆排序,树形选择排序以及有关图的知识!鉴于二叉树的应用型,对于树只做知识梳理:树的结点:一个数据元素及若干指向其子树的分支结点的度:结点拥有的子树数叶子或终端结点:度为0的结点分支结点或非终端结点:度不为0的结点树的度:树内各结点的度的最大值孩子和双亲:结点的子树的根称为该结点的孩子,该结点的
题目:给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数class Solution {public: ListNode* rotateRight(ListNode* head, int k) { ListNode* cur = head; int j = 1; while (cur != NULL && cur->next != NULL) { cur = cur->
基本作用我就不多说了,就是取地址效率提高下面来看两段代码第一个#include <iostream>void getchange(int& n) { n = n + 1;}int main() { int n = 1; getchange(n); std::cout << n << std::endl}第二个#include <iostream>void getchange(int n) { n = n + 1;}i
socket编程,对于多进程,多线程的使用是必不可少的,因此写一篇博客来记录一下子。// 多进程的头文件#include <unistd.h>// 多线程的头文件#include <pthread.h>多进程在此不做讲解了,直接看多线程解释区创建源(监听)套接字#include <sys/socket.h>// AF_INET:本机使用IPv4协议族// SOCK_STREAM:TCP传输协议// 0:protocollfd = socket(A
数据交换:路由器与主机,主机与主机,主机与路由器之间的数据交换电路交换报文交换分组交换:无连接和连接服务IP数据报格式版本:IPv4,IPv6首部长度:单位是4B,最小为5区分服务:优先级服务总长度:首部+数据,单位是1B生存时间:IP分组的保质期,经过一个路由器-1,变成0则丢弃协议:数据部分所使用的协议首部校验和:只检验首部源地址,目的地址:32B当IP数据包大于链路层MTU大小时,只能对IP数据包进行分片标识: 同一数据包用同一份标识标志:DF(中间位):1—禁
1、socket通信socket是一种IPC方法,它允许位于同一台主机(计算机)或使用网络连接起来的不同主机上的应用程序直接交换数据,掌握基本的socket API函数对于网络编程至关重要,无论是自己写网络通信库还是学习开源的网络通信库,都离不开基本的socket API函数。2、网络通信基本流程完整的网络通信流程包括服务端与客户端通过一系列socket函数建立连接。2.1 服务端建立连接过程socket()函数服务端首先调用socket()创建一个fd(文件描述符)用来侦听客服端的连接,通常称
题目:给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。class Solution {public: int rangeSumBST(TreeNode* root, int low, int high) { int n1, n2, n3; if (!root) n1 = 0; if (low<=root->val && root->val<=high) n1
进行Unix网络编程,对计算机网络的大概了解是必不可少的,而在网络这块,TCP/IP协议族又是极其重要的一部分。先来看ifconfig吧以我自己的部分信息为例# 其中的MULTICAST标志通常知名该接口所在主机支持多播ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.94.129 netmask 255.255.255.0 broadcast 192.168.94.255
vector维护的是一个连续空间,所以不论其元素型别如何,普通指针都可作为vector的迭代器而满足所有条件。vector的迭代器// T:数据类型,alloc:空间配置器template <class T, class Alloc = alloc>class vector { public: typedef T value_type; // vector的迭代器是普通指针 typedef value_type* iterator;}vector的数据结构temp
自述:迭代器真是一个神奇的部件,连接算法和容器,不论是看书还是看视频,看迭代器一部分是无用的,必须把所有的关联起来看。作为STL的六大部件,迭代器无疑是极其重要的一环。先来看看《Design Patterns》一书中对他定义:提供一种方法,使之能够依序寻访某个聚合物(容器)所含的各个元素怒,而又无需暴露该聚合物的内部表述方式推荐书籍:《STL源码剖析—侯捷》《Effective C++ —侯捷》STL的中心思想在于,将数据容器和算法分开,彼此独立设计,最后在一一粘胶剂将题目撮合到一起,容
已有的事,后必再有;已行的事,后必再行。UNIX网络编程,一往无前!冲啊!进入正题…首先来了解一下正常的迭代服务器该服务器正常处理一个客户,如果多个客户连接差不多同时达到,系统内核最大数目的限制下把他们排入队列(相当于一个管道,有先后次序),然后每个返回一个accept函数。// 迭代服务器,对于每个客户他都迭代执行一次while(1) {} || for ( ; ; )如果程序运行速度需要较多时间服务每个客户,那么我们必须以某种方式重叠对各个用户的服务,即并发服务器。并发服务器开始辽!
explicit关键字是C++11后开始引入的关键字前面已经有些博客做了细节讲解,在此博客进行一个全面说明为什么要用explicit?在C++的类型转换中,继承了C的强大的隐式转换的功能,但是这样也有极大的缺点正常情况下是short > long,char > int,但是在隐式转换下,他有可能变成char > long,short > int。这在类的单参数构造函数中表现的尤为明显!构造函数一般有两种功能:构造函数和隐式类型转换class student { pub
此文件专门为计算机二级做准备,以及一些其他进阶内容python二级python程序的基本语法python的格式框架缩进规范:一般缩进是4个空格(TAB)一般一行代码的长度不超过80个字符,若超过则通过“\”反斜杠延续行>>> for i in rnage(10):>>> print("Hello World")注释单行注释:## this is the comment for single-line多行注释:# || “
对于C++只有更深,没有浅尝辄止下面先来看C++的标准输入输出流对象标准流头文件#include <iostream>// #include <istream> // input stream输入流// #include <stream> // output stream输出流iostream库定义了三个标准流对象cout:表示标准输出(standard output)的ostream类对象。cout使我们可以向设备输出或者写数据cin:表示标准
第一次写STL的容器,先来介绍一下序列式容器吧。序列式容器,其中的元素都可序,但未必有序,C++语言本身提供了一个序列式容器array,STL另外再提供vector(数组),list(双向链表),deque(双端队列),stack(栈),queue(队列),slist(单链表),priority-queue(优先队列),heap(堆)等等序列式容器,其中stack,queue由于只是将deque改头换面而成,技术上被归类为一种配接器而对于关联式容器,STL可将其分为set(集合)和map(映射表)两大类
I/O模型:阻塞型I/O非阻塞型I/O信号驱动式I/O异步I/OI/O复用阻塞型I/O默认情况下,所有套接字都是阻塞的。非阻塞型I/O进程把一个套接字设置成非阻塞是在通知内核:当所请求的I/O操作非的把本进程置于休眠状态时才能完成,不要把本进程置于休眠状态,而是返回一个错误(后面会进行讲解)I/O复用调用select或poll,阻塞在这两个系统调用中的某一个之上,而不是阻塞在真正的I/O系统调用上传统的多线程模式下也可以进行操作,但是多线程是以CPU为基础的,要进行线程切换,因此
接下来咱们来看看dequedequedeque,简称双端队列,顾名思义,就是两端都可以进行进出操作,即双向开口的连续线性空间。vector当然也可以在头尾两端进行操作,但是其头部操作效率奇差,无法被接受deque的中控器deque系由一段定量连续空间组成。一旦有必要在deque的前端或尾端增加新空间,便配置一段定量连续空间,串接deque的头端额尾端。换来的是极其复杂的迭代器。deque采用一块所谓的map(不是map容器)作为主控,是 一小块连续空间,其中每个元素都是指针,指向另一端的连续空间
Tips:本篇主要以C++的内存管理为例内存在计算机中,每个应用程序之间的内存是相互独立的,通常情况下应用程序A并不能访问应用程序B,每个应用程序所拥有的内存是分区进行管理的内存四区:在程序 A 开辟的内存区域 1 会被分为几个区域,这就是内存四区,内存四区分为栈区、堆区、数据区与代码区。栈区指的是存储一些临时变量的区域,临时变量包括了局部变量、返回值、参数、返回地址等,当这些变量超出了当前作用域时将会自动弹出。该栈的最大存储是有大小的,该值固定,超过该大小将会造成栈溢出。堆区指
指针基本概念:是一种特殊的变量,用来存放某个变量(或对象)的地址语法格式:数据类型符 *指针变量名常见术语:定义:声明一个变量;初始化:对声明的变量赋值;指向:如果指针保存的整形变量的地址,我们就说指针指向这个整形变量;解引:得到指针指向地址的值;指针的初始化:/* 指针变量和其他类型的变量一样,其初始值是不可知的,因此使用前要对他进行赋值。也就是一个指针变量要指向程序中某一个已知变量*/int *p = &a; // &a表示的是a变量的地址int *p =
循序渐进~此处用的是Qcreator的Qt框架,编译器语言为C++。Python和Java前面已有博文,在此不做叙述代码准备:打开Qcreator,新建一个C++文件,在UI文件中新建一个label标签监听的形式有两种方法:直接在主类上进行操作。创建一个子类后跟主类建立父子关系再创建。在此为了展示完整,故在鼠标监听使用第二种方法,在键盘监听使用第一种方法鼠标监听新建一个MyLbael子文件(Class C++)在MyLbael.h头文件中进行声明鼠标监听程序protected:
存储程序:将指令以二进制代码的形式事先输入计算机的主存储器,然后按其在存储器中的首地址执行程序的第一条指令,以后就按该程序的规定顺序执行其他指令,直至程序执行结束。// 在计算机中,硬件和软件在逻辑上是等效的,以运算器为中心冯诺依曼计算机的特点:计算机由五大部件组成(输出设备和输入设备成为I/O设备)指令和数据以同等地位存于存储器,可按地址寻访指令和数据用二进制表示指令由操作码(加减乘除)和地址码组成存储程序以运算器为中心// 以存储器为中心主存储器组成:存储体:数据在存储体内
Python是一门非常方便的静态语言,使用语法简洁,语言格式更易于让大众理解,在当今的大数据的浪潮下,Python的数据分析,机器学习等等起到了巨大的作用,因此学习Python必不可少。当然在我看来,对于一些偏于计算机方向的同学,Python不适宜作为一门个人的主要语言,因为相对于C/C++他缺少了很多东西,比如内存,指针这些,这些关乎代码的存储和运行效率,不可或缺!本博客将持续更新,以进阶和高阶为主,基础部分(列表,字典等等不做概述)。go for it!Python基础函数关键字:globa
文件处理命令命令格式和目录处理命令// 命令格式:命令[-选项][参数]such as:ls -la/etc目录处理命令/*命令名称:ls命令英文原意:list命令所在路径:/bin/ls执行权限:所有用户功能描述:显示目录文件语法:ls 选项[-ald][文件或目录] -a 显示所有文件,包括隐藏文件 -l 详细信息显示 -d 查看目录属性*//*rw-r--r--:文件类型(-二进制文件d目录l链接文件)-文件操作方式(r读 w写 x执行)*//*命令名称:m
今天看到一个好赞的题目!!!分享一波编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。大佬的解法执行时间m/s,时间复杂度:T(n²)空间复杂度:O(n²)class Solution {public: string longestCommonPrefix(vector<string>& strs) { // 判断数组是否为空,若为空则返回空值,否则返回数组的第一个元素作为基数 string res
语言类型:C++main.cpp#include "widget.h"#include <QApplication>int main(int argc, char *argv[]){ QApplication a(argc, argv); Widget w; // 定义一个主窗口对象 w.setWindowTitle("server"); // 设置主窗口的标题 w.show(); // 显示主窗口 return a.exec();}w
C++因为兼容C的特性,对于C中的强制类型转换也是可以利用的先来叙述强制类型转换的全过程数据类型排名(从高到低):long double,double,float,unsigned long long int,long long int,unsigned long int,long int,unsigned int,int有两个规则要注明:/*规则 1:char、short 和 unsigned short 值自动升级为 int 值。细心的读者可能已经注意到,char、short 和 unsign