ChristmasError-Blog

ChristmasError-Blog

——————————————————————————————————————————————————————

C++ BST-binary search tree 二叉搜索树的实现
BST 二叉搜索树(binary search tree)二叉搜索树只能为空树,或者是具有下列性质的二叉树 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树树节点 12345678910//Tree_Node.h#pragma oncestruct TreeNode{ int val; TreeNode* left = nullptr; TreeNode* right=nullptr; TreeNode* parent = nullptr; TreeNode(i...
C++ GeneralizedTable 广义表实现
结点123456789101112131415161718192021222324252627////Generalized_node.h#include<iostream>#include<assert.h>enum Nodetype{ HEAD, VALUE, SUB,};struct Generalized_node { Nodetype _type; Generalized_node *_next; union { char _value; Generalized_node *_sub; }; Gene...
C++ RBTree红黑树的实现
红黑树的性质 每个结点不是红色就是黑色 根节点是黑色的 如果一个根节点是红色的,则它的两个叶子结点是黑色的(没有两个连续的红色结点) 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点(每条路径上黑色结点的数量相等) 所有叶子结点为黑(与平时不同,这里的叶子结点是指空的叶子结点,即为NULL) 红黑树是一种特殊的二叉查找树,这意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。(相较于二叉查找树,我们只要对结点的颜色进行判断和调整)。红黑树虽然复杂,但它的最坏情况运行时间也是非常良好的,它可以在O(log n)...
C++利用RAII技术让系统为我们管理资源(资源获取即初始化——Resource Acquisition Is Initialization)
RAII技术(资源获取即初始化——Resource Acquisition Is Initialization)编写程序我们经常会使用new或者mallco来向系统申请内存,但我们也会可能忘记使用delete去释放他们,而这种不释放手动申请的资源的后果是十分严重(内存溢出 memory overflow)。这时候RAII技术应运而生。 RAII惯用法是在Bjarne Stroustrup的《C++程序设计语言(第3版)》一书中有讲到: 使用局部对象管理资源的技术通常称为“资源获取就是初始化”。这种通用技术依赖于构造函数和析构函数的性质以及它们与异常处理的交互作用 总结RAII技术就类...
C++hash_map 哈希表
map与hash_mapmap与hash_map都是在C++STL中常用的数据结构。map:存储数据结构是采用红黑树实现,提供了key-value的存储和查找功能,查找速度可达log(n)。hash_map:基于hash_table(哈希表)储存,相对map来说,他的查找速度大大的降低,几乎可以看成是常熟时间;但是代价就是消耗更多的内存(但是在现在内存越来越大的情况下,用内存换时间的选择十分值得)。 他们之间的区别: 构造函数:hash_map需要hash函数,比较函数(等于函数);map只需要比较函数(小于函数)。 存储结构:hash_map采用hash表存储,map一般采用红黑树(...
C++11 Lambda表达式
Lambda表达式匿名函数有函数体,但没有函数名。匿名函数是很多高级语言都支持的概念,如lisp语言在1958年首先采用匿名函数。正因为如此,C++11也同样引入了lambda函数。在C++11中,你可以在源码中内联一个lambda函数,这就使得创建快速的、一次性的函数变得简单了。 相同类似功能我们也可以使用函数对象或者函数指针实现:函数对象能维护状态,但语法开销大,而函数指针语法开销小,却没法保存范围内的状态。lambda表达式正是结合了两者的优点。 声明Lambda表达式1234[capture list] (params list) mutable exception->...
C++智能指针:shared_ptr,unique_ptr,weak_ptr
动态内存在C++中,动态内存的管理是通过一对运算符来完成的:new和delete。new:在动态内存中为对象分配空间,并返回一个指向该对象的指针delete:接受一个动态对象的指针,销毁该对象,并释放与之关联的内存 动态内存的使用需要十分小心,因为要在编程的时候要确保在正确的时间对内存进行释放是极其困难的。如果释放内存不及时,在这种情况下就会出现内存泄漏;但若过早的释放(在仍有指针指向该内存的时候就把其释放了),就会产生引用非法内存的指针(称为空悬指针)。 程序使用动态内存主要处以以下三种原因之一: 程序不知道自己需要多少对象 程序不知道所需对象的准确类型 程序要在多个对象间共享数据(...
C++中const的“就近原则”
在做题的时候,编译时经常会遇到关于const的坑,如果在平时不是常用的话就会很容易忘记,在这里整理一下const的“就近原则”的笔记。 指针要理解就近原则首先要明白指针。指针(pointer),可以看作指向(point to)。与引用类似,实现了对其他对象的间接访问。但有两个不同之处:1.指针本身就是一个对象,允许对指针赋值和拷贝,并且指针在周期内可以先后指向几个不同的对象(除非是const指针) const指针是指针变量的值一经初始化,就不可以改变指向,初始化是必要的。其定义形式如下:int * const pTwo; //指向整形的常量指针 ,它不能在指向别的变量,但指向(变...
《深入了解计算机系统》笔记——程序性能优化
程序性能优化编写高性能程序需要满足:1.选择适当的算法和数据结构2.必须编写出变异其能够有效优化以转化成高效可执行代码的源代码 程序优化程序优化的第一步就是消除不必要的工作:例如对同一个内存地址的反复读写我们要尽可能的减少,消除不必要的函数调用、条件测试和内存引用。这些都不依赖目标机器的任何具体属性而属于程序员可控范畴内的代码的改动。为了使性能最大化,程序员和编译器都需要一个目标机器的模型,知名如何处理指令,以及哥哥操作的时序特性。 研究程序的汇编代码表示是理解编译器以及产生的代码会如何运行是进行程序优化的最有效手段之一。通过用汇编语言写代码,这种间接的方法具有的优点是:虽然性能并非最好...
《深入了解计算机系统》笔记——汇编语言和机器语言
汇编语言和机器语言我们不需要完全了解掌握机器语言、汇编语言来进行编程(这是计算机生产厂家要做的事)。我们所要知道的是如何看懂汇编语言就行了。我们所编写的高级语言,被翻译成汇编语言时,编译器会自动进行一些优化处理。 机器语言计算机是不能直接识别我们所编写的C程序或者Java程序的。它只能识别机器语言,而机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指指令系统令的集合。但要用机器语言编写程序,编程人员要首先熟记所用计算机的全部指令代码和代码的涵义。手编程序时,程序员得自己处理每条指令和每一数据的存储分配和输入输出,还得记住编程过程中每步所使用的工作单元处在何种状态。这个工作十分...
avatar
ChristmasError
学习记录博客_(:з」∠)_
FRIENDS
CSDN 写作|Hexo