C++
天马行空_online
看看世界的繁华
展开
-
C++ 部分学习记录
简单的记录一下部分C++学习的容易忽略的点(1) 如果类的成员函数不改变类的值,只是简单获取。那么尽量要添加const 如上图所示,在函数申明的() 后面添加const ,理由如下,如果使用者用const 修饰了这个类的对象,那么这些没有添加了const的函数是没有办法使用的。(2)类的初始化,尽量使用初始化列表来初始化,效率更高。在《深度探索C++ 对象模型》里面将了有四种情况必须用初始化列表来初始化,初始化一个reference menber 的时候 初始化一个...原创 2020-10-13 11:33:28 · 180 阅读 · 0 评论 -
构造函数的显示调用
之前写代码写了一个非常愚蠢的错误,在一个构造函数里面显示的调用了另外一个构造函数。可以先简单的上个例子:#include <iostream> class CTest { public: CTest() { m_a = 1; } CTest(int b) { m_b = b; CTest(); } ~CTest()原创 2020-10-13 10:53:04 · 970 阅读 · 0 评论 -
mutex和semaphore的区别
mutex,一句话:保护共享资源。 典型的例子就是买票: 票是共享资源,现在有两个线程同时过来买票。如果你不用mutex在线程里把票锁住,那么就可能出现“把同一张票卖给两个不同的人(线程)”的情况semaphore的主要用途,一句话:调度线程。保证资源的顺序执行。作者:二律背反链接:https://www.zhihu.com/question/47704079/answer/135859188来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。有...转载 2020-09-16 16:54:13 · 845 阅读 · 0 评论 -
浅谈sizeof 操作符
sizeof 是一个操作符,主要是作用是返回对象或者类型所占用的内存字节数量。用法:sizeof(object) sizeof(type_name) sizeof object sizeof 计算对象的大小主要是转换为对象所在的类型进行计算的。也就说同种类型对象的sizeof值都是一样的。这里的对象可以延伸到表达式,也就说说sizeof可以对表达式进行求值,编译器根据最终的计算结果类型来计算大小。sizeof是编译时进行计算的,和运行无关,不会对表达式进行计算:#include &l..原创 2020-09-03 21:46:33 · 167 阅读 · 0 评论 -
C++ 里面的new/delete 和 new[]/delete[]
在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢?new 和 delete 是函数吗? new [] 和 delete [] 又是什么?什么时候用它们? 你知道 operator new 和 operator delete 吗? 为什么 new [] 出来的数组有时可以用 delete 释放有时又不行? …如果你对这些问题都有疑问的话,不妨看看我这篇文章。new 和 delete 到底是什么?如果找工作的同学看一些面试的书,我相信都转载 2020-09-02 21:29:09 · 136 阅读 · 0 评论 -
C++ vector swap()去除多余容量
今天在查询swap()函数的时候,发现了swap()函数居然可以用来减少vector容器的大小,众所周知,vector的容器的大小只可以增加,不可以减少。当我们使用push_back(),insert(),emplace()等成员方法的时候,有可能会增加容量,但是我们使用pop_back()、erase()、clear() 等方式的时候,并不会减少实际 的内存容量。只是可以删除容器里面的内容。#include <iostream>#include <vector&g...转载 2020-08-30 12:55:15 · 2107 阅读 · 0 评论 -
C++ 的优先队列priority_queue
c++ 中有小堆顶和大堆顶两种数据结构,他们分别的含义是父节点比两个子节点都大或者都小。如此一来堆栈的最顶部就是最大的或者是最小的。大小堆顶一般是hi用连续的容器实现的,比如说数组,vector,queue等。不可以用不连续的容器来实现。主要的 原因是联系连续的数组可以任意地址访问,大小堆顶如果知道了父节点的索引,那么久可以很快的计算出两个子节点的索引。所以需要用连续的容器来作为实现的底层。大小堆的每次插入和删除的时间复杂度都是logn的。(PS给你一个无序的数组,建堆的时间复杂度是O(n)的)。...原创 2020-07-29 23:34:49 · 432 阅读 · 0 评论 -
C++中的constexpr
在C++中有#define 哟const 有 constepr等不同的关键字,他们之间有相似的地方,也有不同的地方。首先是#define 关键字,这个只是在预编译之前的简单替换、const 关键字修饰的更多的表达的是一种readonly的意思,就是只读。这个不一定是常量,但是一定是不可以读取,const变量的初始化可以在运行的时候确定,他只是限制了在运行的时候只可以读取, 实际上const变量在运行的时候也可能是变化的,例如:通过const_cast()进行去除了const限定(对于cons...原创 2020-07-29 12:01:03 · 624 阅读 · 0 评论 -
C++ 中的NULL 和nullptr的区别
在写C++的程序的时候,可以看到NULL 和nullptr两种空指针。他们有哦什么区别勒?一、C程序中的NULL 在C语言中,NULL通常被定义为:#define NULL ((void *)0) 所以说NULL实际上是一个空指针,如果在C语言中写入以下代码,编译是没有问题的,因为在C语言中把空指针赋给int和char指针的时候,发生了隐式类型转换,把void指针转换成了相应类型的指针。int *pi = NULL;char *pc = NULL;二、C++程序...转载 2020-07-29 10:48:30 · 631 阅读 · 0 评论 -
懒汉式单例解决线程安全
懒汉式单例模式首先我们先来回顾一下饿汉式单例模式:class Singleton{ private static Singleton singleton=new Singleton(); private Singleton(){} // 什么都不做 public static Singleton getInstrance(){ return singleton; }}public class Test{ public static转载 2020-07-28 12:59:32 · 860 阅读 · 0 评论 -
STL中的Vector的简单原理
STL中提供了一个非常好用的动态数组模板vector,vector一般有下面的集中函数 begin():返回指向容器中第一个元素的迭代器。 end():返回指向容器中最后一个元素后面的位置的迭代器。 rbegin():返回指向容器中最后一个元素的反向迭代器。 rend():返回指向容器中第一个元素前面的位置的反向迭代器。 erase(...):从容器中删除! clear():从容器中删除所有元素。 front():返回容器中第一个元素的引用。 ...原创 2020-07-26 03:56:58 · 277 阅读 · 0 评论 -
相邻的数据差值最小
题目:牛牛有n朵需要摆放的花,但是每朵花呢,高度都不一样,牛牛不喜欢相邻的花高度相差太多,这样会影响美感。所以牛牛提出了一个“丑陋度”的概念,“丑陋度”意思为在一个摆放序列中,相邻花高度差的最大值。而且牛牛是一个完美主义者,所以他希望:1.将这些花摆成首尾相接的圆形2.为了美观,他希望摆放的花“丑陋度”最小程序应返回:按照这些花排成一个圆的顺序,输出在多个摆放花的序列中,最小的“丑陋度”。输入:5,[2,1,1,3,2]输出:1说明:可以摆成 1 2 3 2 1这样的序...原创 2020-07-25 23:37:08 · 1482 阅读 · 0 评论 -
计算操作奇数
题目1:在牛牛面前放着nnn个数,这些数字既有奇数也有偶数,只不过牛牛对奇数情有独钟,他特别想让这些数都变成奇数。现在牛牛获得了一种能力,他可以执行一种操作:每次选中一个偶数,然后把这些数中与该数相等的数都除以2,例如现在有一个数组为[2,2,3][2,2,3][2,2,3],那么牛牛可以执行一次操作,使得这个数组变为[1,1,3][1,1,3][1,1,3]。牛牛现在想知道,对于任意的nnn个数,他最少需要操作多少次,使得这些数都变成奇数?输入3,[2,2,3]输出 1代码:.原创 2020-07-25 23:10:11 · 217 阅读 · 0 评论 -
快慢指针法~!
题目: 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 链表的结构如下图:struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }}; 这个题目简洁明了,完全不做作。一看这个题目有两个思路:(1)标记法 非常简直直接的思路,就是记录一下走过的...原创 2020-06-07 23:54:00 · 282 阅读 · 0 评论 -
约瑟夫环问题的一般思路
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。这个是非常典型的问题,别人都叫他约瑟夫环问题。(1)比较简单的思路是模拟这个过程,用一个数字去模拟这个过程,每次都删掉一个数据,或者是记录一下。(2)数学归纳法,或者叫做动态规划的东西来做, (2):数学归纳法: ...原创 2020-05-26 14:55:42 · 1989 阅读 · 0 评论 -
__stdcall、__cdcel和__fastcall定义与区别
1、定义__stdcall__stdcall是Pascal方式清理C方式压栈,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上”@”和参数的字节数。 int f(void *p) –>> _f@4(在外部汇编语言里可以用这个名字引用这个函数).__cdecl__cde...转载 2020-04-22 15:00:29 · 133 阅读 · 0 评论 -
多数投票法
问题:找出一个数组中出现次数超过一半的数字,例如 2 0 3 0 1 0 0 0 0 0 1 这个数组中,出现次数最多的是 0,并且超过了一半。所以应该是0.解决思路:(1) Hash最简单的思路,每个数字出现了之后就记录一下,找到之前有没有出现过,有的话就次数加1 这个里面有个小问题是,如果数字很多的话,要找到之前有没有出现过比较困难。所以可以改进一下,通...原创 2020-04-16 23:52:37 · 1012 阅读 · 0 评论 -
extern “C”的作用详解
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言(而不是C++)的方式进行编译。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。 这个功能十分有用处,...转载 2020-04-02 19:12:29 · 126 阅读 · 0 评论 -
C++的智能指针
C++的智能指针就是,可以想指针一样的使用,但是本身其实是一个封装好的类模板主要解决的问题是,当申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了作用域是,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。C++的智能指针,一般有四个auto...转载 2020-04-01 23:57:34 · 112 阅读 · 0 评论 -
C++的强制转换
C中的强制转换 在C语言中的强制转换为如下面所示:short b=1;int a=(int)b;int a=int(b);//******************************************// class type-casting#include <iostream>using namespace std;class CDummy ...转载 2020-04-01 21:18:12 · 782 阅读 · 0 评论 -
C++指针删除后要null一下
原文传送门:https://blog.csdn.net/qq_36570733/article/details/80043321我们在删除一个指针之后,编译器只会释放该指针所指向的内存空间,而不会删除这个指针本身,所以要NULL一下将这个指针变成空指针,防止变成野指针众所周知,最开始我们用new来创建一个指针,那么等我们用完它之后,一定要用delete将该指针删掉。但是,值得注...转载 2019-04-08 23:31:37 · 881 阅读 · 0 评论 -
c++中的STL的vector容器
c++中我相信大家经常要用到STL里面的各种容器来存放自己的数据,既然我们用的这么频繁那么就相应该有一些疑问?1.容器里面什么时候应该存指针?2.容器里面什么时候应该存对象?3.容器怎么在遍历的时候删除某元素?4.容器应该怎么释放掉?一.分析一下STL里面工作方式对于内建类型(int float char等),容器的工作方式是纯粹的位拷贝,这...原创 2019-04-15 22:41:02 · 114 阅读 · 0 评论 -
C++中的类中的函数模板的使用
#include <iostream>using namespace std;class A {public: template<typename T> void display(T temp); template<typename T> A(T temp);};template<typename T> void A::d...转载 2019-04-16 00:08:06 · 8609 阅读 · 0 评论 -
AVL树问题
在学习AVL二叉树的时候,碰到了这个题目:给出一段序列,让后让你找出这个序列生成的AVL树的根节点我的本人的代码如下。主要思路: 每个节点记录值:当前节点的值,其父节点,左右子树,左右子树的高度 每次添加一个节点后,根据查找树的方法,进行生成。 然后根据最后添加的节点,反向向上依次更新父节点的左右子树高度,如果父节点没有或者是其父节点的作用子树的高度没...原创 2019-08-13 01:54:38 · 376 阅读 · 0 评论 -
这么判断一个点是否在三角形的里面还是外面
版权声明:本文为CSDN博主「SixDayCoder」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/sixdaycoder/article/details/79791389问题描述:判断二维平面上一个点P是在三角形ABC的内部还是外部。如图,点P在三角形ABC内部,可以通过以下三个条件判断...转载 2019-08-27 09:24:07 · 1455 阅读 · 0 评论 -
已知道三个点求平面方程(这些玩意都忘了好久了~~)
转载:https://blog.csdn.net/PengPengBlog/article/details/52774421已知三个点坐标为P1(x1,y1,z1), P2(x2,y2,z2), P3(x3,y3,z3)所以可以设方程为A(x - x1) + B(y - y1) + C(z - z1) = 0 (点法式) (也可设为过另外两个点)核心代码://在此之前写好录入三个三维点...转载 2019-08-27 11:43:12 · 22877 阅读 · 1 评论 -
c++中的提取流重载
C++的流插入运算符“<<”和流提取运算符“>>”是C++在类库中提供的,所有C++编译系统都在类库中提供输入流类istream和输出流类ostream。cin和cout分别是istream类和ostream类的对象。在类库提供的头文件中已经对“<<”和“>>”进行了重载,使之作为流插入运算符和流提取运算符,能用来输出和输入C++标准类型的数据。因此...转载 2019-03-26 00:02:16 · 434 阅读 · 0 评论