new与operator new c++中有两种new,一种是new操作符另一种是operator new。new操作符是c++语言级别支持的,类似于sizeof操作符,它会做两件事:分配足够的内存以容纳对象,然后调用构造函数初始化上一步所分配的内存。operator new就是new操作符进行第一步操作调用的函数,它只为对象分配原始内存,类似于malloc。下面详细介绍operator new函数:(1)void* op
epoll系列系统调用 一、文件描述符就绪epoll用来同时监听多个文件描述符是否就绪,那么哪些情况下文件描述符可以被认为是可读、可写或者异常呢?1、文件描述符可读的情况socket内核接收缓冲区中的字节数大于或等于其低水位标记SO_RCVLOWAT。此时我们可以无阻塞地读,并且读操作返回的字节数大于0.socket通信的对方关闭连接。此时对该socket的读操作将返回0.监听socket上有新的连接
leetcode——String to Integer (atoi) 一、如果字符串为空,返回0二、去除字符串首部的空格三、判断正负号四、判断并转化数字字符,如果遇到非数字字符,就返回已转化的值五、分别考虑正数和负数的溢出情况class Solution {public: int myAtoi(string str) { if (str.empty()) return 0; int i = 0;
数组最长递增子序列 int longest_increase_seq1(const vector& nums){ vector max_lens(nums.size(), 1);//max_lens[i]表示数组nums[0,...,i]最长递增子序列的长度 for (int i = 0; i < nums.size(); ++i) { int max_len = 0;
最长公共子串和最长公共子序列 求解左边矩阵对角上连续出现的1的个数也就是求解右边矩阵中的最大值int longest_common_substring(const char* str1, const char* str2){ int len1 = strlen(str1), len2 = strlen(str2); int *pd = new int[len1]; memset(pd, 0, le
二叉树递归/非递归遍历 递归遍历//前序遍历void preorder(TreeNode *root, vector &path){ if(root != NULL) { path.push_back(root->val); preorder(root->left, path); preorder(root->right, path); }}
非递归求取二叉树的最大/小深度 分层遍历的思路:二叉树分层遍历用到的是BFS(广度优先搜索),显然这必须维护一个队列。但是一个队列只能得到遍历结果,并不能一层一层分开,所以必须使用两个队列curr和next,curr保存当前层的所有结点指针,next保存下一层的结点指针,遍历的过程就是出队列的过程,在对curr出队列的同时将推出来的结点的非空左右子结点压入队列next,直到为空那么当前层遍历完毕,同时下一层的所有结点指针也保
守护进程编程惯例 调用fork然后使父进程退出(exit)(1)如果该守护进程是作为shell命令启动,那么父进程终止使得shell认为这条命令执行完毕(2)使得子进程不是进程组组长,保证后续的setsid()系统调用成功调用setsid(),脱离控制终端,登录会话和进程组先介绍一下Linux中的进程与控制终端,登录会话和进程组之间的关系:进程属于一个进程组,进程组号(GID)就是进程组
c++POD 简介 啥是POD类型?POD全称Plain Old Data。通俗的讲,一个类或结构体通过二进制拷贝后还能保持其数据不变,那么它就是一个POD类型。平凡的定义1.有平凡的构造函数2.有平凡的拷贝构造函数3.有平凡的移动构造函数4.有平凡的拷贝赋值运算符5.有平凡的移动赋值运算符6.有平凡的析构函数7.不能包含虚函数8.不能包含虚基类#include
pthread的互斥量和自旋锁 一、自旋锁与互斥量的区别在多处理器环境中,自旋锁最多只能被一个可执行线程持有。如果一个可执行线程试图获得一个被争用(已经被持有的)自旋锁,那么该线程就会一直进行忙等待,自旋,也就是空转,等待锁重新可用。如果锁未被争用,请求锁的执行线程便立刻得到它,继续执行。一个被争用的自旋锁使得请求它的线程在等待锁重新可用时自旋,特别的浪费CPU时间,所以自旋锁不应该被长时间的持有。实际上,这就是自旋锁的设计
c++重载、覆盖、隐藏 重载(overload)是指函数不同的参数列表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数。在同一可访问域内(注意同一访问域,基类和派生类不属于同一访问域)被声明的几个具有不同参数列表(参数类型、个数、顺序)的同名函数,程序会根据不同的参数列来确定具体调用哪个函数。对于重载函数的调用,在编译期间就已经确定,是静态的,它们的地址在编译期间就绑定好了,与多态无关。注意,重载不关心函数的返
指针大小由什么决定 首先,介绍几个基本概念:(主要摘自百度百科)字长:在同一时间中处理二进制数的位数叫字长(CPU处理能力)。通常称处理字长为8位数据的CPU叫8位CPU,32位CPU就是在同一时间内处理字长为32位的二进制数据。二进制的每一个0或1是组成二进制的最小单位,称为一个比特(bit)。 一般说来,计算机在同一时间内处理的一组二进制数称为一个计算机的“字”,而这组二进制数的位数就是“字长
Linux进程状态解析之R、S、D、T、Z、X Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。众所周知,现在的分时操作系统能够在一个CPU上运行多个程序,让这些程序表面上看起来是在同时运行的。linux就是这样的一个操作系统。在linux系统中,每个被运行的程序实例对应一个或多个进程。linux内核需要对这些进程进行管理,以使它们在系统中“同时”运行。li
Linux时间系统调用总结 #include typedef __time_t time_t;//获取time_t表示的当前时间time_t time(time_t *t);struct timeval{ __time_t tv_sec;//秒 __suseconds_t tv_usec;//微秒};//获取timeval表示的当前时间,有BUG,少用int gettimeofday(st
leetcode——Intersection of Two Arrays II 题目:Given two arrays, write a function to compute their intersection.Example:Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2, 2].class Solution {public: vector intersect(vect
一个sample学会使用epoll #include #include #include #include #include #include #include #include #include #include #include #include #define MAX_EVENT_NUMBER 1024#define TCP_BUFFER_SIZE 512#define UDP_BUFFER_
一个sample学会使用c++比较函数对象和hash函数对象 /*1、自定义hash函数对象用于unordered_set中2、自定义Compare函数对象用于排序3、学习使用优先级队列priority_queue*/#include #include #include #include #include using namespace std;//已知0 <= x, y < 100class point{public:
leetcode——Isomorphic Strings 题目:Given two strings s and t, determine if they are isomorphic.Two strings are isomorphic if the characters in s can be replaced to get t.All occurrences of a character must be replaced wi
leetcode——Count Primes 题目:输出小于n的质数的个数方法一:能不能快速判断一个数字n是不是质数呢?1、遍历所有小于n的整数,如果都不可以整除那么n为质数2、遍历所有小于sqrt(n)的整数,如果都不可以整除那么n为质数3、遍历所有小于sqrt(n)的质数,如果都不可以整除那么n为质数显然3是最快的做法,因此我们在搜索到一个质数后要将其保存到数组后面,下次直接遍历质数数组来判断n是不是质数c
java实现的线程池 线程池(Thread Pool)对于限制应用程序中同一时刻运行的线程数很有用。因为每启动一个新线程都会有相应的性能开销,每个线程都需要给栈分配一些内存等等。 我们可以把并发执行的任务传递给一个线程池,来替代为每个并发执行的任务都启动一个新的线程。只要池里有空闲的线程,任务就会分配给一个线程执行。在线程池的内部,任务被插入一个阻塞队列(Blocking Queue ),线程池里的线