AVL树的c++实现 AVL树的c++实现1.概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当 于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年 发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之 差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。 一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:它的左右
Map和Set Map和Setmap和set都是stl中的关联容器,map以键值对的形式存储,key=value组成pair,是一组映射关系。set只有值,可以认为只有一个数据,并且set中元素不可以重复且自动排序,如果需要重复则使用multiset,要说区别的话,存储的东西不一样,应用场景不一样,支持的操作也不一样,很多不同。 map和set支持快速查找和删除,一般使用RB树来实现,当然后面还有用hashtable实现的,使用rb树作为底层结构增删数据都很快,不存在内存移动也就不容易出现迭代器失效的问题,这也就是区
轻量级进程(线程)ID与进程ID 在Linux下,线程又被称为轻量级进程。每一个用户态的线程,在内核中都对应一个调度实体,也拥有自己的进程描述符(task_struct结构体)。 没有线程之前,一个进程对应内核中一个进程描述符,对应一个进程ID。但是引入线程的概念之后,一个用户进程下管辖N个用户态线程。每个线程作为一个独立的调度的实体,在内核态中都有自己的进程描述符,进程和内核描述符一下变成了1:N的关系。POSIX标准又要求同一进程中的线程调用getpid函数时返回相同的进程ID, 于是Linux内核就引入了线程组的概念。多线程的进程,
C++实现搜索二叉树 C++实现搜索二叉树#pragma onceusing namespace std;template<class K>struct BSTreeNode{ BSTreeNode<K>* _left; BSTreeNode<K>* _right; K _key; BSTreeNode(const K& key) :_left(nullptr) , _right(nullptr) , _key(key) {}};template
C++中的继承和多态 C++中的继承和多态1.继承1.1继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。class Person{public: void Print() { cout << "name:" <<
c++模拟实现stack、queue c++模拟实现stack、queue#pragma once#include<vector>#include<list>#include<forward_list>#include <deque>using namespace std;namespace shichun{ template<class T, class Container = deque<T>> class stack {
list的模拟实现 list的模拟实现#pragma oncenamespace shichun{ template<class T> struct ListNode { ListNode<T>* _next; ListNode<T>* _prev; T _data; ListNode(const T& data = T()) :_next(nullptr) , _prev(nullptr) , _data(data) {}
程序地址空间 程序地址空间研究环境kernel2.6.3232位平台敲一段代码:#include <stdio.h>#include <unistd.h>#include <stdlib.h>int g_val = 0;int main(){ pid_t id = fork(); if(id < 0) { perror("fork"); return 0; } else if(id ==
模拟实现vector 模拟实现vector#define _CRT_SECURE_NO_WARNINGS 1#pragma oncenamespace shichun{ template<class T> class vector { public: // Vector的迭代器是一个原生指针 typedef T* iterator; typedef const T* const_iterator;
C++中模拟实现string类 C++中模拟实现string类#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>#include <assert.h>using namespace std;namespace shichun{ class string { friend ostream& operator<<(ostream& _cout, const shichun::string&am
C++中的模板 C++中的模板1.泛型编程如何实现一个通用的交换函数呢?void Swap(int& left, int& right){ int temp = left; left = right; right = temp;}void Swap(double& left, double& right){ double temp = left; left = right; right = temp;}void Swap(char& left, cha
Linux常见指令和权限 Linux常见指令和权限01. ls 指令语法: ls [选项][目录或文件]功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。常用选项:-a 列出目录下的所有文件,包括以 . 开头的隐含文件。-d 将目录象文件一样显示,而不是显示其下的文件。 如:ls –d 指定目录-i 输出文件的 i 节点的索引信息。 如 ls –ai 指定文件-k 以 k 字节的形式表示文件的大小。ls –alk 指定文件-l 列出文件的详细信息。-n 用数字的 UID,
赋值运算符的重载 赋值运算符的重载运算符重载C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。函数名字为:关键字operator后面接需要重载的运算符符号。函数原型:返回值类型 operator操作符(参数列表)注意:不能通过连接其他符号来创建新的操作符:比如operator@重载操作符必须有一个类类型或者枚举类型的操作数用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不 能改变其含义
初识C++ 初识C++1.C++关键字(C++98)C++总计63个关键字,C语言32个关键字asm do if return try continue auto double inline short typedef for bool dynamic_cast int signed typeid public break else long sizeof typename throw case enum mutable static union wchar_t catch explicit namespace
用C语言实现各种排序(附动图) 用C语言实现各种排序算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。算法复杂度相关概念稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。时间复杂度:对排
用c语言实现各种排序(插入、希尔、选择、堆排、冒泡、递归和非递归快排、归并) 用c语言实现各种排序(插入、希尔、选择、堆排、冒泡、递归和非递归快排、归并)由于快排的非递归实现需要用到堆,所以我们先导入堆的代码Stack.h#pragma once#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <stdbool.h>typedef int STDataType;typedef struct Stack{ STDataType* a;
用c语言实现各种排序(插入、希尔、选择、堆排、冒泡、递归和非递归快排、归并) 用c语言实现各种排序(插入、希尔、选择、堆排、冒泡、递归和非递归快排、归并)由于快排的非递归实现需要用到堆,所以我们先导入堆的代码Stack.h#pragma once#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <stdbool.h>typedef int STDataType;typedef struct Stack{ STDataType* a;